假设我有来自数据库的以下字符串:
<div>
<img />
<span>Foo Bar - Keyword</span>
</div>
<h2>Keyword - Foo Bar</h2>
<p>Lorem Ypsum, **Keyword**, Lorem Pysum.</p>
<h2>Heading - Keyword</h2>
<p>Lorem Ypsum, **Keyword**, Lorem Pysum.</p>
...
我现在想要仅用强或者em替换关键字的非常第一个匹配,但仅在段落内部且只有一次,而不是在img,div或其他任何地方,因为它毁了我的HTML。我需要选择什么样的功能和正则表达式?
答案 0 :(得分:0)
如果必须后跟一个结束段落标记(Keyword
),请使用前瞻来设置仅匹配字符串</p>
的条件。
Keyword(?=[^><]*<\/p>)
替换字符串:
<em>$0</em>
<强>更新强>
(?:(?!<p>).)*<p>(?:(?!Keyword).)*\KKeyword(?=[^\n]*<\/p>)
替换字符串:
<em>$0</em>
答案 1 :(得分:0)
此代码在<p>
之前处理Keyword
,并且这样:
(<p(?:[^<]|<(?!\/p))*)(Keyword)
的更换:
$1<em>$2</em>
请务必tell preg_replace() to limit at 1
完整的PHP:
$str = '<div>
<img />
<span>Foo Bar - Keyword</span>
</div>
<h2>Keyword - Foo Bar</h2>
<p>Lorem Ypsum, **Keyword**, Lorem Pysum.</p>
<h2>Heading - Keyword</h2>
<p>Lorem Ypsum, **Keyword**, Lorem Pysum.</p>';
echo preg_replace('/(<p(?:[^<]|<(?!\/p))*)(Keyword)/', '$1<em>$2</em>', $str, 1); // <-- Notice the 1!