如何找到一个正则表达式的多个匹配项?

时间:2010-05-12 14:53:14

标签: php regex

我有以下字符串:

response: id="1" message="whatever" attribute="none" world="hello"

属性的顺序是随机的。可能有许多其他属性。

有没有办法在一个正则表达式中获取id,message和world属性,而不是一个接一个地应用以下三个?

/ message="(.*?)"/
/ world="(.*?)"/
/ id="(.*?)"/

4 个答案:

答案 0 :(得分:2)

您可以通过在前面使用.*的三个正向前瞻断言来实现此目的:

<?php
$re = '/(?=.* message="(.*?)")(?=.* world="(.*?)")(?=.* id="(.*?)")/';

$string = '<response id="1" message="whatever" attribute="none" world="hello" />';

preg_match($re, $string, $matches);
var_dump($matches);

输出:

array(4) {
  [0]=>
  string(0) ""
  [1]=>
  string(8) "whatever"
  [2]=>
  string(5) "hello"
  [3]=>
  string(1) "1"
}

当然,如果缺少这3个参数中的任何一个,这个模式将会失败(这也可能对你有所帮助......)。如果您希望它们是可选的,您可以进一步将前瞻内部包装到非捕获组中并使其成为可选(?:....)?(此示例使“world”参数可选)

/(?=.* message="(.*?)")(?=(?:.* world="(.*?)")?)(?=.* id="(.*?)")/

答案 1 :(得分:0)

我不是一个正则表达式的家伙,所以这可能是错的。如果是,请不要downvote =)告诉我,我会删除它! :-D

你或者这些短语可以匹配吗?

/ (message|world|id)="(.*?)"/

答案 2 :(得分:0)

如果你正在使用preg_match,那么有一个可选的第三个参数,它将存储所有正则表达式 groups (基本上在括号内的任何内容)以及完全匹配。

所以使用整个事物作为一个正则表达式,然后第2,第3和第4个元素将分别是messageworldid(第1个将是整个字符串匹配。

答案 3 :(得分:0)

以下是我能想到的最好的一个。它应该捕获在每个点匹配的实际属性,它们的值以及允许其他任何内容。但这并不完全正确,你最好使用“真正的”解析器。

/((message|attribute|world)="([^"]*)").*?((message|attribute|world)="([^"]*)").*?((?:message|attribute|world)="([^"]*)")/