2012-05-02 25 views
3

我遇到了一些我为我的项目所做的正则表达式的问题(请记住,我是一个正则表达式的初学者,在下面的示例中显示)。我正在尝试使用关联的模式从中抽取某些部分的一段XML代码。可选的正则表达式模式不会产生任何值

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

我使用下面的正则表达式来获得piclink,urlactive,urltarget,urllink和timevar使用preg_match_all:

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

到目前为止好一切运行正确不过,我现在想在关联中捕获可选的名称和alt标签,因为它们并不总是出现。我试图把它们放在括号后面跟着一个?以表明它们是可选像这样:

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

然而,$匹配[“名”]数组总是空的,我不知道我在哪里搞乱了,但我已经尝试了组合的各种和所有的他们导致一个空的结果,除了当我把(?:在最后并封装了从swf =向前的所有东西,然后它返回像数组115结果不接受,因为结果就像$ matches ['name']] [X] =结果,其中x是有时其他1倍,其在

+0

你*需要*使用正则表达式吗?您可以通过使用SimpleXML来轻松解决所有问题。 –

+0

没有xml文件的代码是在php中动态生成的。我可以修改很多代码来存储数据,但是现在使用正则表达式比重新构建整个类以满足需要花费的时间更少。嗯第二个想到我可以使用simplexml与字符串,但我不知道它是否需要畸形的XML代码或它是否需要一个完整的XML。 –

+0

'SimpleXML'可以对字符串和文件进行操作。 –

回答

1

109出于某种原因,我认为,像SimpleXML会更好,但如果你想变脏,则可以使用向前看符号来尝试搭配剩下的字符。

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

谢谢,我也会尝试。 –

+0

无法使用ungreedy :(名称和alt数组元素仍然为空 –

+0

我使用在线正则表达式工具尝试的所有东西似乎无法捕获可选组,如果它是可选的并且不真实 –