有限的正则表达式经验,我正在使用 preg_replace 使用 PHP。
我想替换不在 [no-glossary] ... [/no-glossary] 标签之间的指定“单词”。如果它们不是“单词”和标签之间的空格,或者如果它们是“单词”之后的空格,我的表达就有效,但是如果我在单词之前放置一个空格(预期)它会失败!
这些工作:
$html = '<p>Do not replace [no-glossary]this[/no-glossary] replace this.</p>';
$html = '<p>Do not replace [no-glossary]this [/no-glossary] replace this.</p>';
这不会:
$html = '<p>Do not replace [no-glossary] this [/no-glossary] replace this.</p>';
使用的模式逐部分解释
/ - find
(?<!\[no-glossary\]) - Not after the [no-glossary] tag
[ ]* - Followed by 0 or more spaces (I think this is the problem)
\b(this)\b - The word "this" between word boundaries
[ ]* - Followed by 0 or more spaces
(?!\[\/no-glossary\]) - Not before the [/no-glossary] tag
/
这是代码:
$pattern = "/(?<!\[no-glossary\])[ ]*\b(this)\b[ ]*(?!\[\/no-glossary\])/";
$html = '<p>Do not replace [no-glossary] this [/no-glossary] replace this.</p>';
$html = preg_replace($pattern, "that", $html);
print $html;
输出:
<p>Do not change [no-glossary] that [/no-glossary] changethat.</p>
问题:
- 标签之间的单词已更改。
- 在正确替换的第二个单词前面删除了空格。