Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Puhelinnumeron parsiminen kolmijakoiseksi?

Sivun loppuun

SQ [06.06.2011 20:44:47]

#

Kuinka toteuttaisin semmoisen phpllä että saisin vaikka $puhnum = "0401283789" muutettua muotoon $puhnum = "040 128 3789" ?

Metabolix [06.06.2011 20:46:47]

#

Katko teksti substr-funktiolla ja yhdistä osat välien kera.

Olli [07.06.2011 10:46:30]

#

Oli tylsää ja tein tällaisen funktion. Se tukee siis myös lankapuhelinnumeroita ja maksullisia numeroita.

<?php
// (C) Olli <ollinpostit@gmail.com>
// Saa käyttää, mutta älä levitä

function telFormat($num, $return="return"){
$format = array(
	11	=>	array(0,4,4,3,7,4),
	10	=>	array(0,3,3,3,6,4),
	9	=>	array(0,2,2,3,5,4),
	8	=>	array(0,2,3,3,6,3),
	6	=>	array(0,2,2,4,0,0)
);

$len = strlen($num);

	if(!array_key_exists("".$len."", $format)){
	return"ERR";
	} else {

	$first	= substr($num, $format[$len][0], $format[$len][1]);
	$second	= substr($num, $format[$len][2], $format[$len][3]);
	$third	= substr($num, $format[$len][4], $format[$len][5]);


		if($return == "return"){
		$num = "".$first."&nbsp;".$second."&nbsp;".$third."";
		return $num;
		} elseif($return == "array"){
		$num = array($first, $second, $third);
		return $num;
		} elseif($return == "print"){
		$num = "".$first."&nbsp;".$second."&nbsp;".$third."";
		print $num;
		}
	}
}
?>

Toimintaesimerkki:

<?php print telFormat("0501234567"); ?>

Kirjottelin tuohon kunnolliset ohjeetkin, mutta kone kaatui eikä ohjeet tallentunut.

Teuro [07.06.2011 11:40:55]

#

Siistitty versio Ollin koodista. Poistin tarpeettomia koodirivejä välistä.

<?php
function telFormat($num) {
	$format = array(
		11    =>    array(0,4,4,3,7,4),
		10    =>    array(0,3,3,3,6,4),
		9    =>    array(0,2,2,3,5,4),
		8    =>    array(0,2,3,3,6,3),
		6    =>    array(0,2,2,4,0,0)
	);

	$len = strlen($num);

	$first = substr($num, $format[$len][0], $format[$len][1]);
	$second = substr($num, $format[$len][2], $format[$len][3]);
	$third = substr($num, $format[$len][4], $format[$len][5]);

	$num = $first . " " . $second . " " . $third;

	return $num;
}

print telFormat("0501234567");
?>

Olli [07.06.2011 13:32:58]

#

No joo tuo olikin vähän tarpeeton jota itse laitoin nuo lisäykset =)

The Alchemist [07.06.2011 15:58:18]

#

En nyt oikein ymmärrä tuon Ollin koodin kompleksisuutta ja mielestäni se formatoi kuusinumeroiset numerot väärin, eikä parsi ollenkaan tietyn pituisia numeroita. Teinpä siis oman versioni.

Tulokset muuten samat, paitsi että mielestäni oma skriptini purkaa 6- ja 7-pituiset numerot hienommin ja työstää 8-pitkät eri tavalla. En kyllä tiedä, mikä numero edes on kahdeksan numeron pituinen.

function telFormat2($number) {
	$len = strlen($number);

	if ($len <= 5)
		return $number;

	if ($len == 6)
		return sprintf('%s %s', substr($number, 0, 3), substr($number, 3));

	$return .= sprintf(
		'%s %s %s',
		substr($number, 0, -7),
		substr($number, -7, 3),
		substr($number, -4)
	);
}

Vaan enpähän ymmärrä sitäkään, että mikä tässä oli kysymyksen arvoista.

Olli [07.06.2011 16:12:31]

#

8 numeron pituinen numero: 019 12 345

Tältä sivulta katselin nuita erilaisia numeroita:
http://www.kotus.fi/index.phtml?s=2579

Ja kyllähän tuo ihan oikein ne kuusinumeroiset muotoilee
091234 => 09 1234
eli juuri tuon Kotimaisten kielten tutkimuskeskuksen suosituksen mukaan.

The Alchemist [07.06.2011 16:26:27]

#

Ei se kyllä mikään suositus ole, kuten itsekin toteavat. Itse katsoin vähän vanhempaa matskua ja siellä oli ryhmittelyt miten sattuu. Tuo kuusinumeroinen esimerkki sitä paitsi sisältää suuntanumeron, joten ryhmittely on luonnollisesti eri kuin numerossa, jossa "tunnisteosa" on kuuden pituinen. Kolmannella rivillä on esimerkki tällaisesta numerosta ja se on ryhmitelty kolmen pareihin.

Grez [07.06.2011 16:31:00]

#

Oikeasti nuo pitäisi jaotella niin, että ensin tulee suuntanumero, ja sen jälkeen loppuosa jaettuna kahteen osaan, paitsi jos korkeintaan 4 numeroa jolloin yhdessä osassa.

Eli numeron pituudella on merkitystä vasta, kun suuntanumero on saatu irti.

The Alchemist [07.06.2011 16:34:30]

#

Grez kirjoitti:

Oikeasti nuo pitäisi jaotella niin, että ensin tulee suuntanumero, ja sen jälkeen loppuosa jaettuna kahteen osaan, paitsi jos korkeintaan 4 numeroa jolloin yhdessä osassa.

Eli numeron pituudella on merkitystä vasta, kun suuntanumero on saatu irti.

Suuntanumeron voi minusta olettaa hyvin pitkälti olevan viimeistä seitsemää numeroa edeltävä rimpsu (3-4 numeroa). Tuolla Kotusin sivuilla on esitelty myös numeroa, jossa on 3+8 numeroa, mutta liekö tällaisia sitten oikeasti käytössä?

Selkeästi skripti on tulossa amatöörin kotikäyttöön, joten sen ei tarvitse osata parsia kaiken maailman vinkuintialaisia erikoisnumeroita. De facto kännykkänumero on 3+7 numeroa pitkä, joidenkin markkinointiuunojen numerot 4+7.

Grez [07.06.2011 16:41:35]

#

The Alchemist kirjoitti:

Selkeästi skripti on tulossa amatöörin kotikäyttöön, joten sen ei tarvitse osata parsia kaiken maailman vinkuintialaisia erikoisnumeroita. De facto kännykkänumero on 3+7 numeroa pitkä, joidenkin markkinointiuunojen numerot 4+7.

No eiköhän tässä kaikki viestit 3. jälkeen ole muuta pohdiskelua, kuin aloittajan tarpeeseen vastaamista. Eikä edes aloittaja sanonut, että kyseessä on ainoastaan matkapuhelinnumerot. Kännykkänumeroitakin on aika paljon 4+6 -numeroisia ja jokin verran lyhyempiä, esim. 3+4. 4+7 -numeroisiin en ole itse törmännyt.

Olli [08.06.2011 14:55:02]

#

Markkinointinumerot (pituus 11nroa) pitäisi toimia tuolla minun funktiolla.

Yucca [08.06.2011 19:47:10]

#

Grez kirjoitti:

No eiköhän tässä kaikki viestit 3. jälkeen ole muuta pohdiskelua, kuin aloittajan tarpeeseen vastaamista.

Aloittajan tarve ei ole tullut selväksi. Otsikko puhuu kolmijakoiseksi parsimisesta, mutta eihän se ole mitenkään yksiselitteinen tehtävänasettelu (ja käytettävä ohjelmointikieli jää pääteltäväksi).

Epäselvää on sekin, mitä ongelmaa ollaan varsinaisesti ratkaisemassa. Jos kyse on puhelinnumeroiden tulostamisesta ihmisen luettavaan muotoon, niin silloin kyllä suomalainen standardi ja kansainvälinen ITU-T:n suositus sanovat asiasta jotain, mutta eivät ihan yksiselitteisesti eikä niiden mukainen muoto ole välttämättä käytännössä yleisin kaikissa maissa.

peg [08.06.2011 20:49:29]

#

Grez kirjoitti:

Oikeasti nuo pitäisi jaotella niin, että ensin tulee suuntanumero, ja sen jälkeen loppuosa jaettuna kahteen osaan, paitsi jos korkeintaan 4 numeroa jolloin yhdessä osassa.

Eli numeron pituudella on merkitystä vasta, kun suuntanumero on saatu irti.

Tähän lisäisin vielä +358500123456 = +358 500 123 456

Toisaalta ryhmittelystä pitäisi päästä eroon, koska c/p moniin palveluihin
ei toimi, tarkistus hyväksyy vain numeromerkit.

Metabolix [08.06.2011 21:53:58]

#

HTML:ssä ryhmittelyn voi tehdä span-tageilla, joilla on pieni padding. Näin tulos näyttää tyylikkäältä mutta kopioituu ilman välejä.

Olli [09.06.2011 09:00:48]

#

Tässä span-tageilla toimiva versio minun koodista (Teuron lyhennys):

<?php
function telFormat($num) {
	$format = array(
		11    =>    array(0,4,4,3,7,4),
		10    =>    array(0,3,3,3,6,4),
		9    =>    array(0,2,2,3,5,4),
		8    =>    array(0,2,3,3,6,3),
		6    =>    array(0,2,2,4,0,0)
	);

	$len = strlen($num);

	$first = substr($num, $format[$len][0], $format[$len][1]);
	$second = substr($num, $format[$len][2], $format[$len][3]);
	$third = substr($num, $format[$len][4], $format[$len][5]);

        $span = '<span style="padding-right:5px">';

	$num = "".$span."".$first."</span>".$span."".$second."</span>".$span."".$third."</span>";

	return $num;
}

print telFormat("0501234567");
?>

Ei ole testattu, mutta jos joku jaksaa testata..

The Alchemist [09.06.2011 09:18:52]

#

Sievennystä...

$num = array($f, $s, $t);
printf(
  '<span class="telnum"><span>%s</span></span>',
  implode('</span><span>', $num)
);
span.telnum > span { margin: 0 2px; }

Spaneja käyttäessä pitää vain muistaa se, ettei tagien väliin saa jättää whitespacea tai muuten sanavälit tulevat myös kopioituun tekstiin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta