Php 可选的正则表达式模式不产生任何值

Php 可选的正则表达式模式不产生任何值,php,xml,regex,pcre,Php,Xml,Regex,Pcre,我为我的一个项目做的一些正则表达式有点问题(请记住,我是正则表达式的初学者,如下例所示)。我在一段xml代码中遇到了一点问题,我试图使用相关模式从中提取某些部分 <banner piclink="pic" urlactive="url_active" urltarget="globaltgt" urllink="globallink" timevar="globaldelay" swf="0" smooth="1" name="name" alt="alternate" />

我为我的一个项目做的一些正则表达式有点问题(请记住,我是正则表达式的初学者,如下例所示)。我在一段xml代码中遇到了一点问题,我试图使用相关模式从中提取某些部分

<banner piclink="pic" urlactive="url_active" urltarget="globaltgt" urllink="globallink" timevar="globaldelay" swf="0" smooth="1" name="name" alt="alternate" />

我正在使用以下正则表达式使用preg_match_all获取piclink、urlactive、urltarget、urlink和timevar:

/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>.*)\"/iU
/piclink=\”(?。+)\“+urltarget=\”(?。+)\“+urlink=\”(?.*)\“+timevar=\”(?.*)\”/iU
到目前为止,一切正常,但是,我现在试图捕获与名称和alt标记的关联,它们是可选的,因为它们并不总是出现。我试着把它们放在括号里,后面跟着一个?表示它们是可选的,例如:

(name=\"(?<name>.*)\")?
(名称=\”(?.*)\”?

然而,$matches['name']数组总是空的,我不知道我在哪里搞砸了,但我尝试了各种组合,所有组合的结果都是空的,除了当我放入(?:在结尾处,封装从swf=开始的所有内容,然后它在数组中返回115个不可接受的结果,因为结果类似于$matches['name'][X]=result,其中x有时是1,但由于某些原因,它是109的其他倍。

我同意类似于
SimpleXML
的方法会更好,但如果您想弄脏,可以使用lookaheads尝试与其余字符匹配

/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>[^"]*)\"(?=(.*name=\"(?<name>[^"]*)\")?)(?=(.*alt=\"(?<alt>[^"]*)\")?).*/iU
/piclink=\”(?。+)\“+urltarget=\”(?。+)\“+urllink=\”(?.*)\”+timevar=\”(?[^“]*)\”(?=(?[^“]*)\”(?[^“]*)\”)(?=(((?[^“]*)\”)\”)。/iU

您需要使用正则表达式吗?使用SimpleXML可以很容易地解决您的所有问题。没有xml文件,代码是在php中动态生成的。我可以修改很多代码来存储数据,但现在使用正则表达式比重建整个类来适应这一点花费的时间要少嗯,再想想,我可以将simplexml与字符串一起使用,但我想知道它是否需要格式错误的xml代码,还是需要一个完整的xml。
simplexml
可以对字符串和文件进行操作。是的,我知道,但xml在那一点上并不完整,这就是为什么我说格式错误。它将是不完整的xml,但它仍然需要它吗?这取决于如何操作Breaked..执行
新建SimpleXMLElement(“”;
不会出错。谢谢,我也会尝试。与ungreedy不兼容:(name和alt数组元素仍然为空。如果可选且不可用,那么我使用在线正则表达式工具尝试的所有操作似乎都无法捕获可选组。您使用的是哪个在线工具?这一个,我以前从未失败过。我还对php模型文件进行了测试。