2010-12-17 12 views
0

ich geschrieben habe einen regulären Ausdruck in PHP ermöglichen Strings, die alphanumerischen mit jeder Interpunktion außer & oder @ übereinstimmen. Im Wesentlichen muss ich alles auf einer amerikanischen Standardtastatur mit Ausnahme dieser zwei Zeichen erlauben. Es dauerte eine Weile, mit dem folgenden regulären Ausdruck zu kommen, das zu tun, was ich brauche zu sein scheint:PHP regulären Ausdruck alphanumerische Zeichenfolgen mit einigen (aber nicht allen) Interpunktion

if (ereg("[^]A-Za-z0-9\[!\"#$%'()*+,./:;<=>?^_`{|}~\-]", $test_string)) { 
    // error message goes here 
} 

Welche meine Frage bringt mich ... gibt es eine bessere, einfachere oder effizientere Art und Weise?

+1

'ereg' ist veraltet. Verwenden Sie stattdessen 'preg_match'. Und vergessen Sie nicht, Ihren regulären Ausdruck zu verankern. – cdhowie

+1

ereg veraltet used 'preg_match' – RageZ

+0

Ja, es gibt ...'. * '=) – BeemerGuy

Antwort

2

haben einen Blick auf Zeichenbereiche:

@[!-%'-?A-~][email protected]

Das die Zeichen & (\0x26) und @ (0x40) ausschließen. Mit Blick auf eine ASCII Table, können Sie sehen, wie dies funktioniert: Das Ausrufezeichen ist das erste Zeichen im ASCII-Satz, das ist kein Leerzeichen. Es wird dann alles bis einschließlich des %-Zeichens zusammenpassen, das dem kaufmännischen Und unmittelbar vorangeht. Dann der nächste Bereich bis zum @ Zeichen, das zwischen ? und A liegt. Danach passen wir alles an das Ende des Standard-ASCII-Zeichensatzes an, der ein ~ ist.

aktualisieren

Um die Dinge besser lesbar zu machen, könnte man auch bedenken Sie in zwei Schritten vor: Zuerst filtern etwas außerhalb des Standard-ASCII-Bereich.

@[!-~][email protected]

In einem zweiten Schritt, filtern Sie unerwünschte Zeichen, oder tun Sie einfach eine str_pos auf die Charaktere.

Am Ende können Sie es mit dem vergleichen, was Sie angefangen haben zu sehen, ob es unerwünschte Zeichen enthielt.

Stattdessen könnten Sie auch eine Regex wie diese für den zweiten Schritt verwenden. /[^@&]+/

Die Schritte sind austauschbar und str_pos auf @ oder & als ersten Schritt zu tun, schlechte Zeichen zu identifizieren, weise eine bessere Leistung sein kann.

+0

phant0m,! Preg_match ("@ [! -% '-? A- ~] + @", $ test_string) scheint genau zu entsprechen, was ich brauchte. Vielen Dank! Kannst du erklären, was das @ zu Beginn und das + @ am Ende tun? Bisher war meine Suche nach einer Erklärung erfolglos. Danke noch einmal! –

+0

Es ist das Trennzeichen für das Suchmuster. Sie können sie durch irgendein anderes Zeichen ersetzen, aber es sollte nicht innerhalb des Musters verwendet werden, sonst müssen Sie es umgehen. Nach den Trennzeichen können Sie Optionen wie fallunabhängige und andere Dinge einstellen, aber das ist hier nicht sinnvoll. – phant0m

+0

Ah, das macht jetzt Sinn. Ich habe nicht bemerkt, dass "die Preg-Funktionen jedes nicht-alphanumerische Zeichen als Regex-Trennzeichen zulassen." (von: http://www.regular-expressions.info/php.html). Vielen Dank! –

1

Was dies über:

[^&@] 

mit preg_match

$str = 'a'; 
var_dump(preg_match('~^[^&@]+$~', $str)); // true 

$str = '&'; 
var_dump(preg_match('~^[^&@]+$~', $str)); // false 

$str = '!'; 
var_dump(preg_match('~^[^&@]+$~', $str)); // true 
+0

Ich kann Zeichen wie ä äü eingeben. Wenn Sie die Zeichen nicht auf die weiße Liste setzen, können Sie nicht sicher sein, welches Ergebnis Sie erhalten werden. Nicht, dass ich den Zweck wirklich sehen könnte - aber es würde nicht garantieren, dass die Eingabe mit dem gewünschten Muster übereinstimmt, da Sie möglicherweise nicht alle unzulässigen Zeichen auf die schwarze Liste setzen können. – phant0m

+0

Ja, ich musste fremde Zeichen aussortieren. –

0

Ich denke eher, als numerische Zeichen der Alpha für alle Testen Sie einfach für @ überprüfen und & und verwenden ein nicht?

$reg = '/@|&/'; 
if(!preg_match($reg, "YOUR STRING CAN GO HERE")){ 
// your code goes here 
} 
+1

Der gleiche Haken hier: Sie Blacklist Charaktere, während ich alles eingeben können, dass Sie vergessen, die schwarze Liste, die ziemlich viel ist vergessen. – phant0m