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;
}
}
这里的模式是regex,它包含ignoreWord变量$ ignoreWord值,段落中的span命名为$ string.Suppose这里$ ignoreword是Question:
<br/>
(问题后可以显示任何标记) <br/>
问题(任何标记都可以出现在问题中) 找到所有这些“问题”之后我想用它们附上它们:
<span class='clsIgnoreWord'>Question</span>
。这里只应围绕“问题”一词应用围栏。它不应改变除此之外的单词或含义......或删除其周围的任何字符。
我想要满足上述代码的大多数情况都会得到满足,但有些案例仍有下面提到的问题
它用abcs替换abc,在这种情况下,span标签应该只包含abc并且不应该替换,并且原始文本应该保持不变。
如果找到abcdef然后它在单词中应用替换,替换适用于abcdef字符串的abc部分....如果abc两侧有任何字符,则封闭不应该应用
它也取代了abc-def中的abc ...这不需要发生。不应该应用机箱在这种情况下也是如此。
对上述代码应该进行哪些更改,以便上述情况也满足?
答案 0 :(得分:0)
似乎你想要
$pattern = "/\b(".$ignoreWord.")\b/i";
$replacement = '<span class="clsIgnoreWord">' . $ignoreWord . '</span>';
$result = preg_replace($pattern, $replacement, $string);
此处的关键是\b
,word boundary。字边界是在&#34;字符&#34;之间出现的零宽度匹配。和#34;非单词字符&#34; (包括字符串的开头和结尾,^
和$
)。什么算作&#34;字符&#34;取决于当前的区域设置,但我不认为标点符号会发生。