php preg_match无法返回不匹配

时间:2017-10-03 06:45:08

标签: php preg-match

我有以下用于验证名字,姓氏的PHP代码

if (preg_match("/^[A-Za-z\p{Greek}\s]+$/u", "Hello & World!", $m)) 
{
    //validation pass
    echo "validation pass";
}
else
{
    //validation failed
    var_dump($m);
    echo "validation failed";
}

问题是我期望在$ m [0]找到非匹配元素,所以回显像

这样的消息
echo "{$m[0]} is not allow character(s)";

但是$ m变量是一个空数组

任何帮助表示赞赏 谢谢

1 个答案:

答案 0 :(得分:1)

您无法使用单个正则表达式执行此操作,因为匹配失败后不会存储不匹配的字符。

比赛失败后你可以使用一种倒置的模式,比如

$s = "Hello & World!";
if (preg_match("/^[A-Za-z\p{Greek}\s]+$/u", $s)) {
    echo "validation pass"; //validation pass
}
else {
    if (preg_match_all('~[^A-Za-z\p{Greek}\s]~u', $s, $m)) { //validation failed
        var_dump($m[0]);
    }
    echo "validation failed";
}

请参阅PHP demo。输出:

array(2) {
  [0]=>
  string(1) "&"
  [1]=>
  string(1) "!"
}
validation failed

[^A-Za-z\p{Greek}\s]模式是negated character class匹配除了类中定义的字符之外的任何字符:ASCII和希腊字母和空格。