我在为我的一个项目所做的一些正则表达式方面遇到了一些问题(请记住,我是正则表达式的初学者,这在以下示例中显示)。我在尝试使用关联模式从中提取某些部分的 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 个结果,这是 Not Acceptable ,因为结果类似于 $matches['name'][X] = 结果,其中 x 有时是 1 其他时间由于某种原因,它在 109。
最佳答案
我同意像 SimpleXML
这样的东西会更好,但如果你想变脏,你可以使用 lookaheads 来尝试匹配剩余的字符。
/piclink=\"(?<pic>.+)\".+urltarget=\"(?<target>.+)\".+urllink=\"(?<url>.*)\".+timevar=\"(?<delay>[^"]*)\"(?=(.*name=\"(?<name>[^"]*)\")?)(?=(.*alt=\"(?<alt>[^"]*)\")?).*/iU
关于php - 可选的正则表达式模式不产生任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406139/