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

Php 如何使用一个正则表达式查找多个匹配项?,php,regex,Php,Regex,我有以下字符串: response: id="1" message="whatever" attribute="none" world="hello" 属性的顺序是随机的。可能存在任意数量的其他属性 有没有办法在一个正则表达式中获取id、message和world属性,而不是一个接一个地应用下面三个 / message="(.*?)"/ / world="(.*?)"/ / id="(.*?)"/ 我不是一个雷鬼,所以这可能是错误的。如果是,请不要否决=)请告诉我,我会删除它!:-D 你能把

我有以下字符串:

response: id="1" message="whatever" attribute="none" world="hello"
属性的顺序是随机的。可能存在任意数量的其他属性

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

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

我不是一个雷鬼,所以这可能是错误的。如果是,请不要否决=)请告诉我,我会删除它!:-D

你能把这些词或短语放在一起搭配一下吗

/(message | world | id)=“(.*?”/

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


因此,将整个元素用作一个正则表达式,然后第二、第三和第四个元素将分别是
消息
世界
、和
id
(第一个元素将是匹配的整个字符串。

您可以通过使用三个正面前瞻断言来实现这一点,在它们前面加上
*

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

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

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


下面是我能想到的最好的一个。它应该捕获在每一点上匹配的实际属性,它们的值,并且还允许中间的任何其他内容。虽然这不是严格正确的,但是您最好使用“真正的”解析器


是的,有。但正确的方法是不要对XML使用正则表达式,而是使用实际的解析器。@Jakub Hampl如果字符串只是单个XML标记,那么它肯定是规则的,因此不需要解析器。但总的来说,我同意。它是更好的工具,并且在将来需要“更多”时更容易更改@雅库格:我知道,你说得对。我更改了示例,所以该参数得以解决。:-)不,这将只匹配它找到的第一个属性,而不会导致三个匹配。这是一个毫无意义的问题。你的意思是
()
,而不是
[]
。但是不可能是哪个属性值引用的。这将只匹配第一个属性。我知道preg_match()和匹配数组,但我正在寻找正确的正则表达式。谢谢,非常好。我不知道长相头的事,我会仔细研究的。
array(4) {
  [0]=>
  string(0) ""
  [1]=>
  string(8) "whatever"
  [2]=>
  string(5) "hello"
  [3]=>
  string(1) "1"
}
/(?=.* message="(.*?)")(?=(?:.* world="(.*?)")?)(?=.* id="(.*?)")/
/((message|attribute|world)="([^"]*)").*?((message|attribute|world)="([^"]*)").*?((?:message|attribute|world)="([^"]*)")/