我有以下字符串:
response: id="1" message="whatever" attribute="none" world="hello"
属性的顺序是随机的。可能有许多其他属性。
有没有办法在一个正则表达式中获取id,message和world属性,而不是一个接一个地应用以下三个?
/ message="(.*?)"/
/ world="(.*?)"/
/ id="(.*?)"/
答案 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个元素将分别是message
,world
和id
(第1个将是整个字符串匹配。
答案 3 :(得分:0)
以下是我能想到的最好的一个。它应该捕获在每个点匹配的实际属性,它们的值以及允许其他任何内容。但这并不完全正确,你最好使用“真正的”解析器。
/((message|attribute|world)="([^"]*)").*?((message|attribute|world)="([^"]*)").*?((?:message|attribute|world)="([^"]*)")/