正则表达式问题,用 span php 将字符串括起来


Regex issue to enclose the string with span php

foreach ($ignoreWords as $ignoreWord) {
    if (preg_match("/([^'w^' ]|'<'w+'>|('w+''?))?(" . preg_quote($ignoreWord) . "(''s)?)('<'/'w+'>|[^'w^' ])?/", $string)) {
        $replacement = '<span class="clsIgnoreWord">' . $ignoreWord . '</span>';
        $pattern = "/('<br'/?'>|('w+''?))?(".preg_quote($ignoreWord).")('<br'/?'>)?/";
        $result = preg_replace($pattern, $replacement, $string);
        $stringArray[$key] = $result;
    }
}

这里的模式是正则表达式,它将 ignoreWord 变量$ignoreWord值与名为 $string 的段落中的跨度括起来。假设这里的$ignoreword是问题:

  1. 问题
  2. "问题">
  3. "问题">
  4. 问题
  5. def'问题
  6. "问题">
  7. (问题(
  8. [问题]
  9. {问题}
  10. 问题<br/>(任何标签都可以出现在问题之后(
  11. <br/>问题(任何标签都可以显示为问题(
  12. 问题:
  13. 问题;
  14. 问题
  15. @Question(这里除了@之外,它可以是任何特殊字符(

找到所有这些"问题"后,我想用这个来附上它们: <span class='clsIgnoreWord'>Question</span> .这里只应在"问题"一词周围应用外壳。它不应该改变这个词或含义之外......或删除其周围的任何字符。

我想要的上述代码的大多数情况都得到了满足,但有些情况仍然存在下面提到的问题

  • 它用ABC替换ABC,在这种情况下,span标签应该只包含ABC,不应该进行替换,原始文本应该保持原样。

  • 如果它找到 abcdef,
  • 那么它会在单词内应用替换,替换应用于 abcdef 字符串的 abc 部分....如果 ABC 的两侧有任何字符,则不应应用外壳。

  • 它还取代了 abc 中的 abc-def...这不需要发生。在这种情况下也不应使用外壳。

应该对上述代码进行哪些更改,以便上述情况也满足?

看来你想要

$pattern = "/'b(".$ignoreWord.")'b/i";
$replacement = '<span class="clsIgnoreWord">' . $ignoreWord . '</span>';
$result = preg_replace($pattern, $replacement, $string);

使用测试数据的示例。

这里的关键是'b字边界。单词边界是"单词字符"和"非单词字符"(包括字符串的开头和结尾,^$(之间发生的零宽度匹配。什么算作"单词字符"取决于当前的区域设置,但我认为标点符号永远不会。