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)="([^"]*)")/