繁体   English   中英

如何使用一个正则表达式查找多个匹配项?

[英]How do I find multiple matches with one regular expression?

我有以下字符串:

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

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

有没有一种方法可以在一个正则表达式中获取id,message和world属性,而不是依次应用以下三个属性?

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

您可以通过在它们的前面使用三个正向超前断言(带有.*来实现此目的:

<?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"
}

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

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

我不是正则表达式人,所以这可能是错误的。 如果是这样,请不要拒绝投票=)告诉我,我将其删除! :-D

您可以将这两个词组配对吗?

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

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

因此,将整个内容用作一个正则表达式,然后第二,第三和第四元素分别是messageworldid (第一个元素是匹配的整个字符串。

以下是我能想到的最好的一种。 它应该捕获在每个点匹配的实际属性,它们的值,并且还可以在它们之间允许任何其他内容。 不过,这并不是严格正确的,使用“真实”解析器会很不错。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM