通过替换它来突出显示关键字(但仅限于p标签中)

时间:2014-09-08 07:22:27

标签: php html regex replace tags

昨天我正在寻找大约8个小时的解决方案。我在这里和其他几个平台上。我已经放弃了。所以这是我的第一个问题。我不得不对这个社区说“谢谢”,因为我过去经常在这里找到帮助。谢谢你。

假设我有来自数据库的以下字符串:

<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。我需要选择什么样的功能和正则表达式?

2 个答案:

答案 0 :(得分:0)

如果必须后跟一个结束段落标记(Keyword),请使用前瞻来设置仅匹配字符串</p>的条件。

Keyword(?=[^><]*<\/p>)

替换字符串:

<em>$0</em>

DEMO

<强>更新

(?:(?!<p>).)*<p>(?:(?!Keyword).)*\KKeyword(?=[^\n]*<\/p>)

替换字符串:

<em>$0</em>

DEMO

答案 1 :(得分:0)

此代码在<p>之前处理Keyword,并且这样:

(<p(?:[^<]|<(?!\/p))*)(Keyword)

的更换:

$1<em>$2</em>

Demo

请务必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!