Autor Zpráva
frauen
Profil *
Zdravím,

chtěl bych prosím poradit. Jak nejlépe ošetřit formulář - input pro telefonní číslo?

Děkuji.
panther
Profil
frauen:
nastuduj si regulární výrazy (a když je budeš hledat, najdeš i ten na telefonní číslo).
laijk
Profil
máš to napríklad tu: Regulární výraz pro telefon
frauen
Profil *
Zkusil jsem:
<?php

if (preg_match('^(\+420)? ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}$', 'Tel')) {
        echo 'Špatný formát telefonního čísla.';
} else {
    echo 'OK';
}

?>

Vypisuje stále OK. V čem je prosím problém?
laijk
Profil
lebo tam nemáš negáciu, ak zadáš zlé číslo tak vypíše "OK", ak zadáš dobré vypíše "Špatný formát telefonního čísla."

uprav to takto:
<?php

if (!preg_match('^(\+420)? ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}$', 'Tel')) {
        echo 'Špatný formát telefonního čísla.';
} else {
    echo 'OK';
}

?>
DarkMeni
Profil *
1) Jako testovací řetězec nemáš proměnnou ale test který je 'Tel' takže to testuje ten řetězec.
2) Zkus to prohodit a nebo před preg_match dát vykřičník (negaci)
Jinak já jsem se PHP učil na linuxsoftu a tam je na kontrolu s regulerními výrazy funkce ereg takže zkus třeba toto:
<?php
//skript...
$tel = $_REQUEST["tel"]; //nevím jestli to posíláš getem nebo postem, tak request bere obojí
if(eregi("^(+420)[0-9]{3}[0-9]{3}[0-9]{3}$",$tel)){ //Podpora formátu: +420xxxxxxxxx
  echo "OK";
}else{
  echo "Špatný formát telefonního čísla!";
}
//pokračování skriptu...
?>

Nezkoušel jsem to ale mohlo by to fungovat.
DarkMeni
Profil *
Mohlo by se tam ještě přidat ještě toto kdyby tam uživatel náhodou napsal mezery:
<?php
//skript...
$tel = $_REQUEST["tel"]; //nevím jestli to posíláš getem nebo postem, tak request bere obojí
$tel = eregi_replace(" ","",$tel); //tohle by mělo odstranit mezery
if(eregi("^(+420)[0-9]{3}[0-9]{3}[0-9]{3}$",$tel)){ //Podpora formátu: +420xxxxxxxxx
  echo "OK";
}else{
  echo "Špatný formát telefonního čísla!";
}
//pokračování skriptu...
?>
frauen
Profil *
Zkoušel jsem i výše uvedená řešení, bohužel však nemůžu docílit správné funkčnosti.

Mám následující:
<?php

/**
 * Kontrola telefonního čísla
 *
 * Zdroj: http://www.regularnivyrazy.info/telefonni-cislo.html
 */

// Kontrola
if (!preg_match('^(\+420)? ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}$', $_POST['phone'])) {
    $error = 'Špatný formát telefonního čísla.';
}

// Error?
if (isset($error)) {
    echo $error;
}

?>

Vstup: +420 123 456 789
Výstup: Špatný formát telefonního čísla.

Vstup: 123 456 789
Výstup: Špatný formát telefonního čísla.

Děkuji za pomoc.
_es
Profil
frauen:
Je vôbec toto overovanie formátu vhodné?
Si si istý, že podchytíš naozaj všetky platné čísla?
Nemáš záujem o návštevníkov s nečeským telefónnym číslom?
Nestačí napríklad overenie, či tam sú len číselné znaky, znak + a medzery?
DarkMeni
Profil
Jestli tam tu kontrolu teda chceš, a telefonní číslo bude při registraci nutné tak tento kód mi fungoval:
<?php
	//Header("Content-Type: text/html;charset=utf-8");
	if(!isset($_POST["tel"])){
		echo "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n</head>\n<title>Kontrola telefonního čísla</title>\n</body>\n";
		echo "<form action='".$_SERVER["PHP_SELF"]."' method='POST' enctype='multipart/form-data'>\n";
		echo "Telefonní číslo: <input type='text' name='tel' size='20' />\n";
		echo "<input type='submit' value='Odeslat' />\n";
		echo "</form>\n</body>\n</html>\n";
	}else{
		$tel = $_POST["tel"];
		$tel = eregi_replace(" ","",$tel);
		if(eregi("^\+[0-9]{12}$",$tel)){
			echo "OK<br />";
			echo $tel;
		}else{
			echo "Špatný formát telefonního čísla<br />";
			echo $tel;
		}
	}
?>

Kontrola forátu je nastavena na "+xxx xxx xxx xxx" bez mezer, ale i s mezerama, když tam bude plus a 12 čísel tak to bude platit jako platný formát, akorát ve výstupu bude bez mezer.
_es
Profil
DarkMeni:
12 čísel
Nemôže byť tých tých čísel 11 alebo 13?
Neviem, len sa mi nezdá, že by 12 čísel bol jediný správny medzinárodný formát.
DarkMeni
Profil
No, myslim že víc než +999 tam nebude a když jich bude míň tak se k tomu dá nula (+099) ale kdyby náhodou tak se to dá upravit jako
if(eregi("^\+[0-9]{1,4}[0-9]{9}$",$tel)){...}

a nebo nastavit jen několik možných států:
if(eregi("^\+(420)|(421)|(422)|(423)[0-9]{9}$",$tel)){...}
Marek88
Profil
Nepoužíval bych funkci ereg (a jí podobné), ale preg_match, protože ereg od verze PHP 5.3.0 nefunguje.

Jinak podle mě je tohle kontrolování špatný způsob. Na prvním místě je (mělo by být) pohodlí uživatele a když tam to +420 na českých stránkách nenapíše, tak je snad jasné, že to tam patří. Pokud je tam předvolba důležitá, tak se tam dá programově doplnit a nebo je na ní lepší vyčlenit vlastní input (třeba i typu select s názvy zemí). A i těch děvet číslic by uživatel mohl zadat jako
800 11 22 33 a co pak? Zase ho budeš otravovat, ať dá ty mezery pryč? Pokud je to potřeba mít opravdu ve správném tvaru, tak je lepší ošetřit programově (dát pryč mezery, přidat předvolbu a podobně).
Tori
Profil
frauen [#2], laijk [#3]
Zásadní důvod, proč vám ten regulár s preg_match nefunguje, je ten, že chybí oddělovače. Funkce preg_* používají odlišnou syntaxi než ereg_*, tj. každý regulár musí být uzavřen do oddělovačů (typicky /, #, nebo ~), protože za ukončovacím oddělovačem můžou být ještě další modifikátory vyhledávání (malá/velká písmena apod.). Takže regulár z [#2] by měl vypadat např. takto:
preg_match('/^(\+420)? ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}$/', $telefon)
Jinak chybějící oddělovač(e) generují E_WARNING, to se vám mělo zobrazit.

_es:
Nemôže byť tých tých čísel 11 alebo 13?
I míň - např. v Dánsku jsou čísla běžně osmimístná (pevná linka i mobily), v menší zemi by asi mohla být i kratší. Zřejmě je definovaná jen maximální délka 15 číslic (Odkaz)
panther
Profil
Ještě dodám k úvaze správný meinárodní formát pro ČR, o kterém se nikdo nezmínil:
00420 123 456 789 (+ samozřejmě variace šestičíslí s jednou, dvěma nebo žádnou mezerou, atd.)
thak
Profil *
Ještě to chce ošetřit fake čísla jako +420000000 nebo +420123456789 apod. prvni verzi pres str_split a pak array_unique a count array_unique nesmi byt 1 no a pak to další už jedině přes nějaké pole výskytů toho, co tam uživatelé nejvíc píšou.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: