我正在与php一起使用preg match,并发现了一些奇怪的行为,如下所示(行为在任何版本中似乎都是一致的:]
var_dump(preg_match('/[£]/', '«')); // true
var_dump(preg_match('/£/', '«')); // false
var_dump(preg_match('/[»]/', '«')); // true
var_dump(preg_match('/»/', '«')); // false
我希望所有这些表达式都返回false,但是当在正则表达式中使用方括号(表示匹配此集合中的任何字符)时,正则表达式将返回true。我事先检查了多字节字符串是否受支持,并被告知确实是这种情况,但是我可能会弄错吗?我通常会使用mb_ereg替代方案,但是preg_replace_callback没有一个是我要使用的替代方案。最终,我只想知道这里发生的事情😂,我找到了一种解决方法,所以这不是什么大问题,但是这似乎确实是很奇怪的行为!
您必须为此类测试添加UTF-8标志,即'/[£]/u'
。
从PHP docs:
u(PCRE_UTF8)此修饰符打开与Perl不兼容的PCRE的其他功能。模式和主题字符串被视为UTF-8。无效的主题将导致preg_ *函数不匹配。无效的模式将触发级别为E_WARNING的错误。自PHP 5.3.4起(分别为PCRE 7.3 2007-08-28),五个和六个八位字节的UTF-8序列被视为无效;以前那些被认为是有效的UTF-8。