【问题标题】:PHP Regex error on right-double-quotation-mark右双引号上的 PHP 正则表达式错误
【发布时间】:2014-09-17 12:27:21
【问题描述】:

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

它在一个 UTF-8 字符上工作正常除了 - 双右引号 (U+201D - ”)。

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

正则表达式是:

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

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

【问题讨论】:

  • 我认为你必须使用u修饰符
  • 谢谢!是的 u 修饰符已经解决了这个问题。

标签: php regex


【解决方案1】:

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

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

区别在于最后一个字节之间。在一种情况下,您得到 0x9C,另一种情况下得到 0x9D。在 Windows-1252 编码(这是常见的默认值,经常被错误地标记为 ISO-8859-1)中,0x9C 是 –,但未定义 0x9D。这会导致关于 \S\s 的不可预测的行为,从而导致您的正则表达式中断。

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

【讨论】:

    猜你喜欢
    • 2015-06-10
    • 2013-10-20
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多