右双引号标记上的PHP正则表达式错误

时间:2014-09-17 12:27:22

标签: php regex

我有一个函数可以从较长的字符串中找到并提取3个单词的“条带”到数组中。单词旁边的标点符号应包含在单词中(例如,后跟逗号的单词应被视为单个单词)。

在一个UTF-8字符 - 一个双权引号(U + 201D - “)上,除了之外的效果很好。

我在我的正则表达式中做错了什么,或者这是一个PHP错误?

正则表达式是:

$myarray = preg_match_all(
    "/(\S)*(\s)(\S)*(\s)(\S)*(\s)/",
    $incomingstring,
    $output, 
    PREG_PATTERN_ORDER);

奇怪的是,正则表达式没有Double Left 引号(U + 201C - “)或我试过的其他一些unicode字符的问题。

1 个答案:

答案 0 :(得分:2)

当被视为单字节字符时,“被视为0xE2,0x80,0x9D

同样,“变为0xE2,0x80,0x9C

区别在于那里的最后一个字节。在一种情况下,你得到0x9C,另一个得到0x9D。在Windows-1252编码中(这是常见的默认编码,通常错误标记为ISO-8859-1),0x9C为 - ,但未定义0x9D。这导致\S\s出现不可预测的行为,导致您的正则表达式中断。

正如评论中最后指出的那样,解决方案是使用u修饰符告诉你的正则表达式使用UTF-8而不是单个字节。