用于拆分主题标签的正则表达式,但忽略

时间:2017-02-06 14:34:01

标签: php regex

我有一个字符串,我想在某个" context"之后匹配主题标签,例如|product

|product之后我想匹配之后的主题标签。

所以这是我的完整字符串|product#houtprint#laserprint|materiaal#hout

这是我的正则表达模式,直到\|product(?<product>#[^\|]+)。 我现在在#houtprint#laserprint上找到一个匹配项,但我想单独匹配它们#houtprint#laserprint

这也是我的PHP部分:

preg_match_all("~\|".$context."(?<".$context.">#[^\|]+)~", $tags_string, $matches);

如何确保我将产品作为单独的组?

1 个答案:

答案 0 :(得分:2)

您需要设置一个基于\G的边界,以便preg_match_all可以匹配连续的主题标签(在您指定的子字符串之后相互跟随):

(?:\|product|\G(?!\A))(?<product>#[^|#]+)

不确定你真的需要这个命名的捕获组。

请参阅regex demo

<强>详情:

  • (?:\|product|\G(?!\A)) - |product substring(\|product)或上一次成功匹配的结束(\G(?!\A))(可以交换这些分支以获得更好的性能)
  • (?<product>#[^|#]+) - &#34;产品&#34;命名捕获组匹配
    • # - 哈希符号
    • [^|#]+ - |#以外的一个或多个字符。

PHP demo

$re = '/(?:\|product|\G(?!\A))(?<product>#[^|#]+)/';
$str = '|product#houtprint#laserprint|materiaal#hout';
preg_match_all($re, $str, $matches);
print_r($matches["product"]);
// => Array ( [0] => #houtprint [1] => #laserprint )