【问题标题】:REGEX: Grabbing everything until a specific word正则表达式:抓住一切,直到一个特定的词
【发布时间】:2010-09-13 21:46:13
【问题描述】:

例如:<a><strike>example data in here</strike></a>

我想要a标签内的所有内容,到最后

/<a>([^<]*)<\/a>/

&lt;a&gt; 标签内没有其他标签时,它可以工作,但如果有呢?

我想知道你是否可以告诉它抓取直到 [^&lt;/a&gt;] 而不是只抓取 [^&lt;] 的所有内容。

使用/&lt;a&gt;(.*)&lt;\/a&gt;/ 效果不佳。有时我会在 &lt;a&gt; 标记中得到所有内容,而有时我会在该调用中包含大量行。

【问题讨论】:

    标签: php html regex


    【解决方案1】:
    /<a>(.*?)<\/a>/
    

    应该可以。这 ?使它变得懒惰,因此在匹配&lt;/a&gt; 部分之前尽可能少地抓取。但使用 .将意味着它匹配所有内容,直到找到&lt;/a&gt;。如果你希望能够跨行匹配,可以使用下面的 if with preg_match

    /<a>(.*?)<\/a>/s
    

    末尾的“s”将正则表达式置于“单行”模式,这意味着 .字符匹配所有字符,包括换行符。见other useful modifiers

    【讨论】:

    • 这将一直有效,直到您在 中有一个 : 并且这与著名的括号匹配正则表达式问题相同。传统的正则表达式无法解决这个问题。你最好用一个普通的旧堆栈。
    • 在哪个混乱的 HTML 版本中, 出现在另一个 标记中?
    • @Kibbee:你在万维网上发现的乱七八糟的版本;-)
    • 但是,即使您使用了像 Beautiful Soup 这样的优秀 HTML 解析器,在嵌套链接的情况下您能期望什么样的结果?对于错误的输入,结果是不确定的。它会抛出异常,还是做出最好的猜测?输入不良数据时没有正确的输出。
    • 很好的解决方案.. 很好,但是使用这个更正的版本来匹配可能的新行:/([\w\W]*?)/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多