我有一个函数,可以从较长的字符串中查找并提取 3 个单词“ strip ”到数组中。单词旁边的标点符号应包含在单词中(例如,后跟逗号的单词应被视为单个单词)。
它工作正常除了在一个 UTF-8 字符 - 双右引号 (U+201D - ”) 上。
我的正则表达式是否做错了什么,或者这是一个 PHP 错误?
正则表达式是:
$myarray = preg_match_all(
"/(\S)*(\s)(\S)*(\s)(\S)*(\s)/",
$incomingstring,
$output,
PREG_PATTERN_ORDER);
奇怪的是,正则表达式对于双左引号(U+201C - “)或我尝试过的其他一些unicode字符没有问题。
最佳答案
当被视为单字节字符时,”被视为0xE2、0x80、0x9D
同样,“变为0xE2、0x80、0x9C
区别在于最后一个字节之间。在一种情况下,您会得到 0x9C,另一种情况会得到 0x9D。在 Windows-1252 编码(这是常见的默认值,经常被错误标记为 ISO-8859-1)中,0x9C 是 –,但 0x9D 未定义。这会导致 \S
和 \s
出现不可预测的行为,从而导致您的正则表达式损坏。
正如最后在评论中指出的那样,解决方案是使用 u
修饰符告诉您的正则表达式以 UTF-8 而不是单个字节工作。
关于PHP 正则表达式右双引号错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890546/