可选的正则表达式模式没有任何价值

时间:2012-05-02 00:17:53

标签: 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" />

我使用以下正则表达式使用preg_match_all获取piclink,urlactive,urltarget,urllink和timevar:

/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>.*)\"/iU

到目前为止一切顺利,但我现在正试图通过关联捕获名称和alt标签,这些标签是可选的,因为它们并不总是出现。我试过把它们放在括号后跟一个?表明它们是可选的,如:

(name=\"(?<name>.*)\")?

然而$ matches ['name']数组总是空的,我不知道我搞砸了但是我尝试了各种各样的组合,所有这些组合都会导致空结果,除非我放(? :在最后并封装从swf =开始的所有内容然后它确实返回115结果在数组中是不可接受的,因为结果就像$ matches ['name'] [X] = result,其中x有时是1次由于某种原因它在109。

1 个答案:

答案 0 :(得分:1)

我同意像SimpleXML之类的东西会更好,但如果你想变脏,你可以使用前瞻来尝试与剩下的角色匹配。

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