正则表达式问题用span php封装字符串

时间:2015-12-28 10:24:50

标签: php regex

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:

  1. 问题
  2. '问题'
  3. “问题”
  4. 问题的
  5. def'Question
  6. `Question`
  7. (问题)
  8. [问题]
  9. {问题}
  10. 问题<br/>(问题后可以显示任何标记)
  11. <br/>问题(任何标记都可以出现在问题中)
  12. 问题:
  13. 问题;
  14. 问题,
  15. @Question(除了@之外,它可以是任何特殊字符)
  16. 找到所有这些“问题”之后我想用它们附上它们: <span class='clsIgnoreWord'>Question</span>。这里只应围绕“问题”一词应用围栏。它不应改变除此之外的单词或含义......或删除其周围的任何字符。

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

    • 它用abcs替换abc,在这种情况下,span标签应该只包含abc并且不应该替换,并且原始文本应该保持不变。

    • 如果找到abcdef然后它在单词中应用替换,替换适用于abcdef字符串的abc部分....如果abc两侧有任何字符,则封闭不应该应用

    • 它也取代了abc-def中的abc ...这不需要发生。不应该应用机箱在这种情况下也是如此。

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

1 个答案:

答案 0 :(得分:0)

似乎你想要

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

Example using your test data

此处的关键是\bword boundary。字边界是在&#34;字符&#34;之间出现的零宽度匹配。和#34;非单词字符&#34; (包括字符串的开头和结尾,^$)。什么算作&#34;字符&#34;取决于当前的区域设置,但我不认为标点符号会发生。