PHP 正则表达式右双引号错误

标签 php regex

我有一个函数,可以从较长的字符串中查找并提取 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/

相关文章:

php - DES 加密字符串并转换为十六进制

php - PHP PDO 语句可以接受表名或列名作为参数吗?

javascript - JavaScript 中正则表达式的递归匹配

regex - 如何在R中条件下的字符串后添加 "."

php - 在 PHPStorm 中将一个目录路径映射到另一个目录路径

php - 将 X 个数组主菜转换为单个变量

php - 将 SQL 转换为 Laravel

正则表达式:括号中的必需字符

python - 使用正则表达式替换括号内的字符

javascript - 如何使用 javascript 正则表达式全局查找并替换文本区域中字符串的开头