[英]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
,则有一个可选的第三个参数,它将存储所有正则表达式组 (基本上在括号内的所有内容)以及完整匹配项。
因此,将整个内容用作一个正则表达式,然后第二,第三和第四元素分别是message
, world
和id
(第一个元素是匹配的整个字符串。
以下是我能想到的最好的一种。 它应该捕获在每个点匹配的实际属性,它们的值,并且还可以在它们之间允许任何其他内容。 不过,这并不是严格正确的,使用“真实”解析器会很不错。
/((message|attribute|world)="([^"]*)").*?((message|attribute|world)="([^"]*)").*?((?:message|attribute|world)="([^"]*)")/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.