【问题标题】:Optional regex pattern produces no value可选的正则表达式模式不产生任何价值
【发布时间】:2012-05-11 11:28:37
【问题描述】:

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

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

【问题讨论】:

  • 需要使用正则表达式吗?改用 SimpleXML 可以很容易地解决您的所有问题。
  • 没有 xml 文件,代码是在 php.ini 中动态生成的。我可以修改很多代码来存储通过的数据,但现在打一个正则表达式比重建一个完整的类来满足这个需要更省时。嗯,第二个想法我可以将 simplexml 与字符串一起使用,但我想知道它是否需要格式错误的 xml 代码或是否需要完整的 xml。
  • SimpleXML 可以对字符串和文件进行操作。
  • 是的,我知道,但当时 xml 不完整,这就是我说格式错误的原因。它会被破坏的xml,但它仍然会接受它吗?
  • 这取决于.. 做new SimpleXMLElement("&lt;banner from above ... /&gt;"); 工作时没有错误的程度。

标签: php xml regex pcre


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我也试试。
  • 不适用于 ungreedy :( name 和 alt 数组元素仍然为空。
  • 我使用在线正则表达式工具尝试的所有操作似乎都无法捕获可选组,如果它是可选且不贪婪的
  • 您使用的是哪个在线工具?
  • regex.larsolavtorvik.com 这个,以前从来没有让我失望过。我还对 php 模型文件进行了测试。
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多