正则表达式匹配一个单词后的特定单词

时间:2016-03-04 09:12:19

标签: php regex

所以我有以下样本:

  

Lorem ipsum dolor SEARCHWORD坐下来,精神上的adipistur elitis elit。       Fusce lacus nisl,feugiat laoreet dignissim sit amet,       关键词gravida vel velit。 Nunc SEARCHWORD elementum risus orci,ac       tristique sem fringilla SEARCHWORD eget。 Morbi maximus lectus nulla,       sed tempor nibh SEARCHWORD condimentum ut。 Sed tincidunt cursus nibh

我希望所有 SEARCHWORD 匹配KEYWORD ,并将其替换为<b>SEARCHWORD</b>等周边标签。一直在尝试和寻找一天......这是否可能与正则表达式?如果是的话,是否有人知道如何使用正则表达式来解决这个问题?

所以,我希望在字符串中第一次出现KEYWORD后匹配所有SEARCHWORD。预期的输出是:

  

Lorem ipsum dolor SEARCHWORD坐下来,精神上的adipistur elitis elit。       Fusce lacus nisl,feugiat laoreet dignissim sit amet,       关键词gravida vel velit。 Nunc SEARCHWORD elementum risus orci,ac       tristique sem fringilla SEARCHWORD eget。 Morbi maximus lectus nulla,       sed tempor nibh SEARCHWORD condimentum ut。 Sed tincidunt cursus nibh

我试过这个:

mb_ereg_replace('(?<=keyword)(.*?)(searchword)', '\1<b>\2</b>', $text, 'img');

2 个答案:

答案 0 :(得分:4)

要匹配字符串中第一次出现SEARCHWORD后的所有KEYWORD,您可以使用基于\G的正则表达式

(?:KEYWORD|(?!^)\G).*?\KSEARCHWORD

请参阅regex demo

(?:KEYWORD|(?!^)\G)与第一个KEYWORD匹配,然后(?!^)\G要求下一个匹配显示在上一个匹配的位置。

.*?匹配0+任何字符(因为正则表达式与DOTALL /s选项一起使用)尽可能少,直到第一个SEARCHWORD和{{1}省略整个匹配值直到搜索词。

PHP demo

\K

注意:如果您需要将$re = '~(?:KEYWORD|(?!^)\G).*?\KSEARCHWORD~su'; $str = "Lorem ipsum dolor SEARCHWORD sit amet, consectetur adipiscing elit. Fusce lacus nisl, feugiat laoreet dignissim sit amet, KEYWORD gravida vel velit. Nunc SEARCHWORD elementum risus orci, ac tristique sem fringilla SEARCHWORD eget. Morbi maximus lectus nulla, sed tempor nibh SEARCHWORD condimentum ut. Sed tincidunt cursus nibh"; $result = preg_replace($re, "<b>SEARCHWORD</b>", $str); echo $result; 作为整个单词进行搜索,请将其与SEARCHWORD括起来(如果搜索字包含字母数字/ {{1}如果前导/尾随字符可能是非单词字符,则使用\b_

答案 1 :(得分:1)

你不必通过&#39; img&#39;作为选择。请参阅this reference page

    var_dump(mb_ereg_replace('.*?(keyword).*?(searchword).*?$', '\1<b>\2</b>', 'AAAAAAAAkeywordBBBBBBBCCCCCCsearchwordDDDDDD'));
   //output : string 'keyword<b>searchword</b>' (length=24)