preg_match 而关键字附加到其他内容

preg_match while the keyword attached to something else

假设我有一个很长的字符串,我想以包含关键字的方式对其进行切割(关键字基于一种模式,例如{query:ABCD:1234}),关键字前5个字和后面5个字。如果关键字单独出现,我可以使用此正则表达式找到它:

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

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

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

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

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

感谢 Wiktor Stribiżew,这个正则表达式将修复它:

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

您可以使用

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}) - 第 2 组:出现 5 次任何 1+ 非单词字符后跟 1+ 单词字符