【问题标题】:preg_match_all: Include non-ASCII characterspreg_match_all:包括非 ASCII 字符
【发布时间】:2014-09-22 10:11:21
【问题描述】:

我有一个 preg_match_all 来搜索段落中的单词。它找不到西里尔字符等。如何更改它以执行所有类型的字符(英语、西里尔文、重音字符等):

preg_match_all( '/\b' . $testWord .'\b/i', $content, $matches, PREG_OFFSET_CAPTURE );

我尝试将 u 添加到正则表达式的末尾,这似乎是一个解决方案,但我在这里询问这是否是最佳做法,或者是否有更好的方法我正在显示的正则表达式。

preg_match_all( '/\b' . $testWord .'\b/iu', $content, $matches, PREG_OFFSET_CAPTURE );

谢谢

【问题讨论】:

  • 我认为您的处理方式是错误的...我会说将您的 testWord 替换为 \p{L}+,它匹配来自任何语言的任何类型的字母。

标签: php regex preg-match-all


【解决方案1】:

不幸的是,即使使用 u 修饰符,单词边界简写 \b 也会起作用(即与您期望的位置不匹配。)您需要用否定的环视替换它们以检查 \pL (任何字母)或\pM(任何组合重音符号。)

像这样:

preg_match_all(
    '/(?<![\pL\pM])' . $testWord .'(?![\pL\pM])/iu',
    $content,
    $matches,
    PREG_OFFSET_CAPTURE
);

【讨论】:

  • 谢谢——这对我很有效。我用俄语、法语希伯来语和汉语单词进行了测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 2023-04-07
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多