ugrás a tartalomhoz

PHP RegExp személynévre

vitaliyplay · 2011. Júl. 17. (V), 12.44
Helló!

Egy olyan RegExp-t szeretnék megvalósítani, amely igazzal tér vissza ha az alábbiak teljesülnek:
- nincs benne "illegális" karakter (pl.: $,',",+,!,%,/,=,(,),{,} stb.)
- tartalmazhatja a magyar ábécé bármelyik karakterét

Eddig ezzel próbálkoztam, sajnos engedi például a '$' jelet:
/^[-a-zA-Z_éáőúűöüó]/i

Egyébként a felhasználó által megadott személynevet (külön adja meg a vezetéknevet és a keresztnevet) akarom ellenőrizni vele a preg_match() függvény segítségével, szóval ha valaki tud jobb megoldást, várom az ötleteket!

Előre is köszönöm az építő jellegű hozzászólásokat!
 
1

Vagy azt add meg, mit tartalmazhat, vagy azt, hogy mit nem

Poetro · 2011. Júl. 17. (V), 12.59
Vagy azt add meg, mit tartalmazhat, vagy azt, hogy mit nem. Egyébként miért csak pont ezeket a karaktereket? Hogyha valaki, szerb, cseh, szlovák, horvát, francia stb. akkor már nem is tud regisztrálni, mert nem fogadja el a keresztnevét vagy vezetéknevét? Érdemesebb olyan karakterosztályokat választani, amik tartalmazzák a betűket.
/^(?:\p{L}|[_\-])+$/u
A \p{L} vagy máshogy írva \pL tartalmazza az összes betű és betű módosító karaktert. Ezen kívül ugye a szöveg tartalmahat kötő és alulvonás jeleket és ebből kell felépülnie a szövegnek az elejétől a végéig. A Unicode karakterek mintaillesztéséről is van dokumentáció. És amennyiben nem adsz meg u kapcsolót, ne adj meg nem ASCII karaktereket egy reguláris kifejezésben, mert annak fura eredményei lehetnek.
2

Ez bizony fail

vitaliyplay · 2011. Júl. 17. (V), 13.29
Valamit rosszul csináltam?

if(preg_match("/^(?:\p{L}|[_\-])+$/u","Árvíztűrő tükörfórógép"))
  echo "IT WORKS";else echo "FAIL";
3

Szóköz

Poetro · 2011. Júl. 17. (V), 14.55
Azt nem mondtad, hogy lehet benne szóköz. Ha azt akarod, hogy legyen, akkor rakd bele a kifejezésbe.
/^(?:\p{L}|[_\- ])+$/u
4

Ékezet

vitaliyplay · 2011. Júl. 17. (V), 15.42
Sajnos nem engedi az ékezeteket.

Itt a forrás, és itt megtekintheted akcióban.


<?php

echo "<form method='post' action='$_SERVER[PHP_SELF]'>\n";
echo "<input type='text' name='regexp' value='".(isset($_POST["regexp"])?stripslashes($_POST["regexp"]):"")."' style='width:150px;padding:5px;'/>\n";
echo "<input type='submit' name='regexp_submit'/>\n";
echo "</form>\n";


if(isset($_POST["regexp_submit"])){
	if(preg_match("/^(?:\p{L}|[_\- ])+$/u",stripslashes($_POST["regexp"])))
	echo "IT WORKS";else echo "FAIL";
}

?>

5

Sajnos nem engedi az

kuka · 2011. Júl. 17. (V), 15.50
Sajnos nem engedi az ékezeteket.
De legalább elfogad egy darab szóközt személynévként.

Egyébként a szerver ISO-8859-2 kódolásról tesz szót a HTTP fejlécben, úgyhogy én vagy csattogtatnám a header() függvényt, vagy kivenném a reguláris kifejezéstől az u flaget. Legalábbis nálam parancssorból ez a különbség zavarja meg.
6

U flag eltávolítva

vitaliyplay · 2011. Júl. 17. (V), 15.56
És működik :) Nem baj ha elfogad egy darab szóközt, azt majd megoldom strlen()-nel vagy valami mással. Köszönöm mindkettőtöknek!
7

Minimális hosszúság

pkadam · 2011. Júl. 17. (V), 16.54
/^(?:\p{L}|[_\-\. ]){3,}$/
Így legalább 3 karakternek kell lennie :) Ezzel megúszod az strlen()-t, persze lehet még cifrázni: korlátlan számú csoport, amiben két korlátlan (de minimum 1) elemű betűcsoport közt van max. 2 nembetű karakter (ugye a "Dr. Xyz" miatt nem elég az 1). Ja, és a fentiben a pont is benne van, ugye akik rövidítik valamelyik nevüket.
8

Így legalább 3 karakternek

kuka · 2011. Júl. 17. (V), 16.54
Így legalább 3 karakternek kell lennie :)
Azaz most már 3 szóközt kell nyomni ahhoz, hogy elfogadja. Én inkább ezt tanácsolom:
/^\p{L}+(?:[_. -]\p{L}+)*$/
9

Mármint escape-elve így

pkadam · 2011. Júl. 17. (V), 17.02
/^\p{L}+(?:[_\. \-]\p{L}+)*$/
10

Mármint escape-elve

kuka · 2011. Júl. 17. (V), 17.07
Mármint escape-elve így
Mármint ott nem szükséges.
11

Hm

pkadam · 2011. Júl. 17. (V), 17.23
Akkor már Poetro verziójában sem kellett volna, vagy valami változott? Az alulvonást pedig szerintem ki lehet venni, én azt nem láttam még névben.
12

A dokumentáció Character

kuka · 2011. Júl. 17. (V), 17.44
A dokumentáció Character classes lapján említi:
The minus (hyphen) character can be used to specify a range of characters in a character class. For example, [d-m] matches any letter between d and m, inclusive. If a minus character is required in a class, it must be escaped with a backslash or appear in a position where it cannot be interpreted as indicating a range, typically as the first or last character in the class.
All non-alphanumeric characters other than \, -, ^ (at the start) and the terminating ] are non-special in character classes, but it does no harm if they are escaped.
Vagyis nem baj, hogy ott voltak a fordított törtvonalak, csak rontják az olvashatóságot.

Az alulvonáson utólag én is elgondolkoztam…
13

Jó tudni

pkadam · 2011. Júl. 17. (V), 18.34
Érdekes, ezt nem tudtam. Bár talán jobb, ha az ember azt jegyzi meg, hogy mindig escape-eljen, és akkor nem fut bele hibába. Tulajdonképpen a ?: is kivehető ilyen szempontból, mert egy backreference nem sok vizet zavar :)

Egyébként én rendszerint a % jelet használom delimiternek, mert úgy kevésbé rondák a webcímes regexek :)
14

Tulajdonképpen a ?: is

kuka · 2011. Júl. 17. (V), 18.44
Tulajdonképpen a ?: is kivehető ilyen szempontból, mert egy backreference nem sok vizet zavar :)
Nyúlfarknyi reguláris kifejezés egyszeri használatánál tényleg nem. De az már a helyes berögződések kategóriába tartozik, úgyhogy én is inkább mindenhova beírom.
15

Valami nem jó

vitaliyplay · 2011. Júl. 17. (V), 19.08

<?php

echo "<script type='text/javascript' src='http://code.jquery.com/jquery.js'></script>\n";
echo "<script type='text/javascript'>jQuery(document).ready(function(){jQuery('#asd').focus();});</script>\n";
echo "<form method='post' action='$_SERVER[PHP_SELF]'>\n";
echo "<input type='text' name='regexp' value='".(isset($_POST["regexp"])?stripslashes($_POST["regexp"]):"")."' style='width:200px;padding:5px;' id='asd'/>\n";
echo "<input type='submit' name='regexp_submit' style='padding:5px;'/>\n";
echo "</form>\n";


if(isset($_POST["regexp_submit"])){
	if(preg_match("/^\p{L}+(?:[\. \-]\p{L}+)*$/",stripslashes($_POST["regexp"])))
	echo "IT WORKS";else echo "FAIL";
}

?>
Itt megtekinthető működés közben.

Írjátok be, hogy "árví" (természetesen idézőjelek nélkül), ezt elfogadja. Viszont az "árvíz" stringet már nem.
16

u

pkadam · 2011. Júl. 17. (V), 19.28
Kell az az u flag szerintem. Ha nem viszi, akkor még a kód elejére a következő sor:
mb_internal_encoding('UTF-8');
Ez sosem árt.
17

Ékezet

vitaliyplay · 2011. Júl. 17. (V), 19.49
Az u flag-gel hibának jelzi az ékezetes karaktereket. Az mb_internal_encoding() meg nem csinált semmit. Megjegyezném, hogy ISO-8859-2-es kódolást használok.
18

UTF-8

pkadam · 2011. Júl. 17. (V), 20.12
Akkor azt erősen érdemes UTF-8-asra állítani.