【问题标题】:Escaping -> and => when parsing HTML using regular expression使用正则表达式解析 HTML 时转义 -> 和 =>
【发布时间】:2009-03-03 13:31:09
【问题描述】:

我需要解析并返回我们 PHP 代码文件中的标记名和属性:

<ct:tagname attr="attr1" attr="attr2">

为此,构建了以下正则表达式:

(\<ct:([^\s\>]*)([^\>]*)\>)

此表达式按预期工作,但在解析以下代码时会中断

<ct:form/input type="attr1" value="$item->field">

原来的正则表达式因为 $item-> 字段中的 > 字符而中断。我需要构建一个忽略 -> 或 => 但不是单个 > 的正则表达式。

我愿意接受任何建议...提前感谢您的帮助。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    试试这个:

    <ct:([^\s\>]*)((?:\s+\w+\s*=\s*(?:"[^"]*"|'[^']*')\s*)*)>
    

    但如果是 XML,最好使用 XML 解析器。

    【讨论】:

    • +1 表示“使用 XML 解析器”。您无法使用正则表达式可靠地解析 XML,句号。
    【解决方案2】:

    你可以尝试像这样使用消极的lookbehind:

    (\<ct:([^\s\>]*)(.*?)(?<!-|=)\>)
    

    匹配:

    <ct:tagname attr="attr1" attr="attr2">
    <ct:form/input type="attr1" value="$item->field">
    

    不确定它是否最适合您的情况,但尊重约束。

    【讨论】:

    • 但它会导致回溯。
    【解决方案3】:

    一般来说,任何解析问题都会很快遇到上下文无关但不规则的语言结构。编写一个上下文无关的解析器可能是一个更好的[1] 解决方案,忽略除您感兴趣的元素之外的所有内容。

    [1] 从“做正确的事”的角度来看,“更好”,不一定是投资回报。

    【讨论】:

      【解决方案4】:

      我认为您想要做的不是识别-&gt;=&gt;,而是忽略引号对之间的所有内容。

      我认为可以通过插入 ((

      ("[^"]*")*
      

      )) 在合适的地方。

      【讨论】:

        【解决方案5】:

        我的建议是匹配同一个表达式中的属性。

        \<ct:([^\s\>]*)((([a-x0-9]+)=\"([^\"]*)\")*)\>
        

        编辑: 删除了关于 > 属性值中 xml 无效的部分。

        【讨论】:

        • 属性值中的 ‘>’ 是完全格式良好的 XML。
        猜你喜欢
        • 2014-06-08
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 2014-06-26
        • 2016-05-01
        • 1970-01-01
        相关资源
        最近更新 更多