首页 > 解决方案 > preg_match 而关键字附加到其他东西

问题描述

假设我有一个很长的字符串,我想把它剪成包含一个关键字(关键字是基于一个模式,比如 {query:ABCD:1234}),关键字前面有 5 个单词,后面有 5 个单词。如果关键字单独出现,我可以使用这个正则表达式找到它:

preg_match("/(([^ ]+ ){5})$keyword (([^ ]+ ){5})/", $text, $matches);

但是如果关键字附加到一些其他字符(例如逗号或点),上面的正则表达式就找不到它。如果我将正则表达式更改为这个:

preg_match("/(([^ ]+ ){5})$keyword(([^ ]+ ){5})/", $text, $matches);

它找到附加到逗号的关键字,但不是单独的。

如何使用正则表达式涵盖这两种情况,单独关键字和附件?

标签: phpregexstringpreg-match

解决方案


您可以使用

preg_match("/((?:\w+\W+){5})" . preg_quote($keyword, "/") . "((?:\W+\w+){5})/", $text, $matches);

该模式现在将匹配:

  • ((?:\w+\W+){5})- 第 1 组:任何 1+ 个单词字符出现 5 次,后跟 1+ 个非单词字符
  • preg_quote($keyword, "/")-$keyword包含所有特殊字符和正则表达式分隔符的文本已转义
  • ((?:\W+\w+){5}) - Group 2: five occurrences of any 1+ non-word chars followed with 1+ word chars

推荐阅读