Autor Zpráva
Schindler
Profil *
Dobrý večer,

dnes odpoledne jsem dodělával stránky, potřeboval jsem ošetřit poslední vstup do formuláře a nastal problém. Potřebuji na vstupu zadat celé jméno v UTF8 - může obsahovat a-z, A-Z a bílý znak. Není omezen počet mezer, kdyby někdo měl třeba tři jména (není moc podstatné), tak aby nenastala chyba. Ale nevím a nikde jsem nenašel, (resp. našel, ale nefungovalo mi to) jak udělat regulerní výraz, který běžně pracuje s UTF8, tedy i českými znaky.

if(... ereg("^[A-z[:space:]]*$", $new_name) ...)
{
...
}

Při vstupu "Jan Novak" vše proběhne v pohodě, v případě "Jan Novák" se podmínka nesplní, to je jasné, ale ani při variantách se nic neprovede.

Někdo nějaké řešení, byl bych moc vděční za váš čas. Předem díky.
Davex
Profil
Funkce ereg* jsou zastaralé a budou z nových verzí PHP odstraněny. Použij funkci preg_match.

if (preg_match("~^[\p{Latin} ]+$~u", $jmeno)) {
  // vyhovuje
}
Schindler
Profil *
Děkuji za odpověď, ale nepomohlo :-( Opět, když zadám "Jan Novak", tak proběhne vše v pořádku, v případě "Jan Novák" ne. Nějaký další nápad?

if((preg_match("~^[\p{Latin} ]+$~u", $new_name))){
nemeja
Profil
Stačí hledat
Regulární výraz - písmena české abecedy + mezera
Regulární výraz
Schindler
Profil *
Tohle jsem také našel a stále nic. Zkusím přidat další indícii.

Pokud zadám "Jan Novak" do formuláře, tak se vše provede, při zadání "Jan Novák" do formuláře se nic nestane. Pokud si nechám vstup na výstupu zobrazit, tak je tam vždy vstup, takže to je zobrazeno správně.

$new_name = $_POST["name"];

if( ... && preg_match('~^[a-ž ]+$~ui', $new_name) && ... )
{
...
}

Když místo textu z formuláře dám do proměnné nebo rovnou do preg_match "Jan Novák", tak se vše provede.

if( ... &&  preg_match('~^[a-ž ]+$~ui', "Jan Novák") && ... )
{
...
}
Kde může být tedy chyba? Už opravdu nevím.
tiso
Profil
miesto medzery daj \s:
'~^[a-ž\s]+$~ui'
Lepšie takto:
'~^[a-ž ]+\s*?$~ui'
Schindler
Profil *
Vše se chová pořád stejně :-( Nechápu, že když zadám místo proměnné řetězec s diakritikou, tak že to funguje, ale když je v proměnné diakritika, tak nikoliv. Pro kontrolu si vždy nechávám vypsat výsledek preg_match.

"Jan Novak" -> 1
"Jan Novák" -> 1
$new_name = "Jan Novak" -> 1
$new_name = "Jan Novák" -> 1
(když je $_POST["name"] "Jan Novak") $new_name = $_POST["name"] -> 1
(když je $_POST["name"] "Jan Novák") $new_name = $_POST["name"] -> 0

Už doopravdy nevím, budu to muset asi udělat uplně nějak jinak ...
Davex
Profil
Je na stránce s formulářem pro zadání jména nastaveno kódování UTF-8?

<meta charset="utf-8">
Schindler
Profil *
Samozřejmě.
polonium
Profil
Asi bych v regularnim vyraze nepuzival interpunkci, kdybych to musel skutecne overovat, tak bych skusil toto:
"~^[\D ]+$~i"

Tady par dobrych rad:
http://www.regularnivyrazy.info/shrnuti-syntaxe.html
Schindler
Profil *
Díky polonium! Až tohle řešení funguje. Moc ti za něj děkuji!
juriad
Profil
Schindler:
poloniovo řešení jen testuje, zda řetězec obsahuje nečíslice. Proto projde i jméno #@$%^&. A prošlo by i jméno složené ze samých mezer.

echo preg_match('~^\\p{L}+( \\p{L}+)*$~u', "Jan Novák äěéřťýůíóöášďëŕúüôľžßčçñňĺ"); # mělo by vrátit 1 = splněno
polonium
Profil
A nebo to muzem skusit obracene. Rict co vsechno tam nechcem :) Tak to muzem udelat takhle:
"~^([^\d\W ]+ ){2,3}$~i"
Pisu to z hlavy na rychlo, treba se pletu, ale tomuhle by mel vyhovovat jakykoliv retezez obsahujici 1 az 2 mezery a neobsahujici cisla a nealfanumericke znaky.
juriad
Profil
polonium:
Řetězec vyhovující tvému regexu musí končit mezerou. Navíc Schindler píše: „Není omezen počet mezer“.
Ani pak ti to fungovat nebude; regexem ~^[^\d\W ]+$~i neprojde ani áéíóů (na anglickém locale).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0