Этого можно добиться, используя три положительных прогнозных утверждения с .*
в начале:
<?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="(.*?)")/