php - 可选的正则表达式模式不产生任何值

标签 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 个结果,这是 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/

相关文章:

php - 将 Linux Curl 命令转换为 PHP

php - 使用 $wpdb->prepare 查询 IN 子句

python - csv 将所有行写入一列 python

c# - 使用 linq to XML 将 xml 文件导入到 datagridview。数据显示不正确

c# - 看看 Regex 对象是用什么模式创建的?

Javascript:正则表达式匹配/替换未按预期工作

javascript - jQuery .load 返回空 div(PHP 页面)

php - 确定数组中的所有值是否相等

android - 使用数据绑定(bind)在xml中的工具栏导航图标上应用点击事件

java - 在 Java 正则表达式中 - 如何仅在附加到字符串时保留数字