正在使用正则表达式PHP苦苦挣扎?

时间:2013-03-12 07:48:02

标签: php regex preg-match

我试图在PHP中放置一个正则表达式匹配,以查找该字符串是否包含除以下字符以外的任何其他无效字符,

~!@#$%^&*()_-+=\}]{[::'"/>.<,
alpha, space, numeric

我想打印字符串,如果它包含除前面提到的字符之外的任何其他字符

ßab? - Invalid
Ba,-  - Valid

我尝试使用preg_match输入很少但无法完成输入。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

<强>更新

此表达式将匹配有效范围的负集:

$valid = preg_quote('~!@#$%^&*()_-+=\}]{[::\'"/>.<,', '/');

if (preg_match("/[^$valid\d\sA-Za-z]/", $invalid)) {
        echo "invalid chars\n";
}

我在这里使用preg_quote()来确保所有字符都被正确转义。

旧答案

我根据你的问题计算了负集:

if (preg_match('/[\x00-\x08\x0c\x0e-\x1f\x3b\x3f\x60\x7c\x7f-\xff]/', $str)) {
        echo "matches invalid chars\n";
}

要获得此套装,您可以使用以下代码:

$s = '~!@#$%^&*()_-+=\}]{[::\'"/>.<,'
        . join('', range('a', 'z'))
        . join('', range('A', 'Z'))
        . join('', range('0', '9'))
        . " \t\r\v\n";

$missing = count_chars($s, 2);
print_r($missing);

它打印一组不在$s内的序数字符代码;你可以生成以上模式。

答案 1 :(得分:0)

以下正则表达式将匹配包含特殊字符,字母,空格,数字等的任何字符串。

/^[\s\w~!@#$%^&*()+=\}\]{\[:'"\/>.<,-]*$/

^是字符串的开头.. $是字符串的结尾.. ^$是必需的,因为它们会匹配输入完全而不是部分

[]是一个字符类,可以匹配其中任何一个字符..

*是一个量词,可以匹配前面的字符,组或字符类 0到很多次..