3

我为我的项目做的一些正则表达式有点问题(请记住,我是正则表达式的初学者,这在以下示例中显示)。我在尝试使用关联模式从中提取某些部分的 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由于某些原因。

4

1 回答 1

1

我同意类似的东西SimpleXML会更好,但如果你想弄脏,你可以使用前瞻来尝试匹配剩余的字符。

/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>[^"]*)\"(?=(.*name=\"(?<name>[^"]*)\")?)(?=(.*alt=\"(?<alt>[^"]*)\")?).*/iU
于 2012-05-02T00:40:17.317 回答