我有一个函数可以从较长的字符串中找到并提取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字符的问题。
答案 0 :(得分:2)
当被视为单字节字符时,“被视为0xE2,0x80,0x9D
同样,“变为0xE2,0x80,0x9C
区别在于那里的最后一个字节。在一种情况下,你得到0x9C,另一个得到0x9D。在Windows-1252编码中(这是常见的默认编码,通常错误标记为ISO-8859-1),0x9C为 - ,但未定义0x9D。这导致\S
和\s
出现不可预测的行为,导致您的正则表达式中断。
正如评论中最后指出的那样,解决方案是使用u
修饰符告诉你的正则表达式使用UTF-8而不是单个字节。