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是问题:
- 问题
- "问题">
- "问题">
- 问题
- def'问题
- "问题">
- (问题(
- [问题]
- {问题}
- 问题
<br/>
(任何标签都可以出现在问题之后( -
<br/>
问题(任何标签都可以显示为问题( - 问题:
- 问题;
- 问题
- @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
,字边界。单词边界是"单词字符"和"非单词字符"(包括字符串的开头和结尾,^
和$
(之间发生的零宽度匹配。什么算作"单词字符"取决于当前的区域设置,但我认为标点符号永远不会。