【问题标题】:Regex to match specific words after one word正则表达式匹配一个单词后的特定单词
【发布时间】:2016-03-04 09:12:19
【问题描述】:

所以我有以下示例:

Lorem ipsum dolor SEARCHWORD sat amet, consectetur adipiscing elit。 Fusce lacus nisl, feugiat laoreet dignissim sat amet, 关键字 gravida vel velit。 Nunc SEARCHWORD elementum risus orci, ac tristique sem fringilla 搜索词 eget。 Morbi maximus lectus nulla, sed tempor nibh SEARCHWORD condimentum ut。 Sed tincidunt cursus nibh

我想匹配 all SEARCHWORD after KEYWORD 并将它们替换为周围的标签,例如 <b>SEARCHWORD</b>。现在一直在尝试和寻找一天......这甚至可以用正则表达式吗?如果是,有人知道如何用正则表达式解决这个问题吗?

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

Lorem ipsum dolor SEARCHWORD sat amet, consectetur adipiscing elit。 Fusce lacus nisl, feugiat laoreet dignissim sat 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');

【问题讨论】:

  • 你在编程什么?向我们展示您的代码。
  • @WiktorStribiżew ereg_replace 已弃用,但 mb_ereg_replace 不建议使用。不幸的是,preg_replace('/(?&lt;=keyword)(.*?)(searchword)/iu', '\1&lt;b&gt;\2&lt;/b&gt;', $test); 仍然无法正常工作。
  • 是的,只是仔细检查过。试试this demo。我仍然不知道你的预期输出是什么,所以我不明白什么不起作用,你应该在问题正文中解释,而不是在 cmets 中。
  • @WiktorStribiżew 我正在regex101.com 尝试一切,这就是为什么如果正则表达式有效,编程语言无关紧要。
  • @mansur:regex101 有 bug 和 3 个选项,只有 3 种正则表达式风格,还有更多的风格。了解正则表达式的风格非常重要。 Python re 不支持\G,Java 也不支持。

标签: php regex


【解决方案1】:

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

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

regex demo

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

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

PHP demo:

$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;

注意:如果您需要将SEARCHWORDs 作为整个单词进行搜索,请使用\bs 将其括起来(如果搜索单词由字母数字/_ 字符组成),或者使用(?&lt;!\w)(?!\w) 如果前导/尾随字符可能是非单词字符。

【讨论】:

    【解决方案2】:

    您不必将“img”作为选项传递。见this reference page

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      相关资源
      最近更新 更多