在PCRE中捕获未知重复的模式

时间:2011-08-17 16:17:44

标签: php regex

对于经验丰富的正则表现主义者来说,这可能是一个快速的问题,但我无法正确执行匹配。

假设我有一个看起来像这样的字符串:

http://aaa-bbbb-cc-ddddd-eee-.sub.dom

我想要捕获所有“aaa”,“bbbb”,“cc”和“ddddd”子串,但我不确定会有多少(例如,让所有三胞胎都通过“ ZZZ“)。

这是我正在尝试使用的正则表达式:

/http:\/\/(\w*?\-)+\.sub\.dom/

我这样写是因为:

  1. 我想匹配子字符串,但我希望每个字符串在解析时终止
  2. 我想捕获一个或多个这些子串
  3. 但似乎只是保存了它所做的 last 匹配(在上面的例子中,它只匹配“eee - ”。

    有没有一种很好的方法可以捕获所有匹配的子串?

    更多信息:我正在使用PHP的PCRE函数preg_replace_callback。谢谢!

2 个答案:

答案 0 :(得分:4)

不,不可能匹配未知数量的捕获组。

如果您尝试重复捕获组,它将始终包含捕获的最后一个值。

你能更广泛地解释一下你想做什么吗?也许还有另一种简单的方法(可能没有正则表达式)。

答案 1 :(得分:2)

如果你想要子域中的项目,然后是破折号之间的所有匹配......这应该有效:

$string = "http://aaa-bbbb-cc-ddddd-eee-.sub.dom";

preg_match("/^http:\/\/([\w-]+?)\..*$/i", $string, $match);

$parts = explode('-', $match[1]);

print_r($parts);

如果没有这样做,你可能需要构建一个小的解析脚本来自己解析字符串。