PHP一段正则表达式匹配结果不一致的问题

WBOY
Freigeben: 2016-06-06 20:46:41
Original
1221 Leute haben es durchsucht

我自定的函数如下,功能是匹配出特殊字符:

<code class="lang-PHP">function hasSpecialChar($subject) {
    $pattern = "/[`~!@#$%^&*()+=|{}':;',\\[\\].\/?~!@#¥%……&*()——+|{}【】‘;:”\"“’。,、?]/";

    if (preg_match($pattern, $subject)) {
        return true;
    }

    return false;
}
</code>
Nach dem Login kopieren
Nach dem Login kopieren

我的结果:

<code>var_dump(hasSpecialChar('问答社区')); // boolean true
var_dump(hasSpecialChar('Segmentfault')); // boolean false
var_dump(hasSpecialChar('@Segmentfault')); // boolean true
</code>
Nach dem Login kopieren
Nach dem Login kopieren

可以从第一个结果中看出是'问答社区'这个中文字符串被匹配出了特殊字符,但是我在Rubular上匹配'问答社区'则匹不出特殊字符,请问是不是我哪里写错了?还是preg_match函数的为题呢?一直找不到原因。

路过的大哥们帮帮忙,谢谢。

回复内容:

我自定的函数如下,功能是匹配出特殊字符:

<code class="lang-PHP">function hasSpecialChar($subject) {
    $pattern = "/[`~!@#$%^&*()+=|{}':;',\\[\\].\/?~!@#¥%……&*()——+|{}【】‘;:”\"“’。,、?]/";

    if (preg_match($pattern, $subject)) {
        return true;
    }

    return false;
}
</code>
Nach dem Login kopieren
Nach dem Login kopieren

我的结果:

<code>var_dump(hasSpecialChar('问答社区')); // boolean true
var_dump(hasSpecialChar('Segmentfault')); // boolean false
var_dump(hasSpecialChar('@Segmentfault')); // boolean true
</code>
Nach dem Login kopieren
Nach dem Login kopieren

可以从第一个结果中看出是'问答社区'这个中文字符串被匹配出了特殊字符,但是我在Rubular上匹配'问答社区'则匹不出特殊字符,请问是不是我哪里写错了?还是preg_match函数的为题呢?一直找不到原因。

路过的大哥们帮帮忙,谢谢。

但是我在Rubular上匹配'问答社区'则匹不出特殊字符

Rubular是基于Ruby的,Ruby 1.9以后对中文支持得很不错了。

请问是不是我哪里写错了?

需要加上u修饰符,开启UTF-8支持

<code class="lang-php">$pattern = "/[`~!@#$%^&*()+=|{}':;',\\[\\].\/?~!@#¥%……&*()——+|{}【】‘;:”\"“’。,、?]/u";
</code>
Nach dem Login kopieren

一直找不到原因。

是PHP对中文支持不够好。

中文在PHP里是以16进制保存的,这就带来问题了。

比如,你的例子中,你匹配的那些特殊符号中包括中文的逗号,你告诉PHP的是,我要匹配一组特殊符号,其中包括中文的逗号,[,],但是PHP不认识中文,它听到的是,你要匹配一组数据,其中包括\xef\xbc\x8c(中文逗号转换成十六进制),然后你传给它的“问答社区”,其中“区”字转换成十六进制就是\xe5\x8c\xba。你可以看到,这里\x8c匹配上了,所以最后结果是true

同理,你可以尝试找一下字是因为和哪个特殊符号的十六进制匹配上了?

php汉字匹配可以考虑 mb_ 相应的函数,例如:mb_ereg(),虽然有些问题,但是大体上能比较省事的解决问题。
如果使用GBK字符集建议考虑转成UTF-8再处理。

PHP如果需要处理中文正则,请一定使用小写字母U
如把你的代码改成 这个即可

<code>$pattern = "/[`~!@#$%^&*()+=|{}':;',\\[\\].\/?~!@#¥%……&*()——+|{}【】‘;:”\"“’。,、?]/u";
</code>
Nach dem Login kopieren

不过我经常这样干

<code>$pattern = "/[`~!@#$%^&*()+=|{}':;',\\[\\].\/?~!@#¥%……&*()——+|{}【】‘;:”\"“’。,、?]/isu";
</code>
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!