【问题标题】:PHP preg_replace_callback match string but exclude urlsPHP preg_replace_callback 匹配字符串但排除 url
【发布时间】:2019-03-25 09:52:45
【问题描述】:

我要做的是在内容块中找到所有匹配项,但忽略标签内的任何内容,以便在 preg_replace_callback() 中使用。

例如:

test
<a href="test.com">test title</a>
test

在这种情况下,我希望第一行匹配,第三行匹配,但不是 url 匹配,也不是 a 标签之间的标题匹配。

我有一个我觉得很接近的正则表达式:

#(?!<.*?)(\btest\b)(?![^<>]*?>)#si

(这与 url 部分不匹配)

但是如何修改正则表达式以排除 a 和 /a 之间的“测试”?

【问题讨论】:

  • and the fourth line to match Erm,你的输入只有三行?
  • 您还必须考虑嵌套标签吗?例如&lt;a&gt;test&lt;b&gt;test&lt;/b&gt;test&lt;/a&gt;,或自动关闭标签?听起来像是不是正则表达式的工作(HTML和正则表达式通常不能很好地协同工作)
  • HTML 和正则表达式不是好朋友。使用解析器,它更简单、更快且更易于维护。见:php.net/manual/en/class.domdocument.php
  • 它不使用嵌套标签,不幸的是由于应用程序我必须使用正则表达式,但我很感谢你深思熟虑的问题和建议。

标签: php regex preg-replace-callback


【解决方案1】:

我最终自己解决了。这个正则表达式模式会做我想要的:

#(?!<a[^>]*?>)(\btest\b)(?![^<]*?<\/a>)#si

【讨论】:

    【解决方案2】:

    如果总是相同的模式,您可以使用 [A-Z] 或 [A-Za-z] 之类的组合

    【讨论】:

    • 这是如何回答问题的?
    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多