代码之家  ›  专栏  ›  技术社区  ›  Aaron Butacov

只匹配不在<code>块中的backticks和Regex

  •  1
  • Aaron Butacov  · 技术社区  · 14 年前

    需要发生什么

    在一个文本块中,假设我们有以下一行文本:

    The query you need to use is 
    <code>SELECT `post_name` FROM table WHERE id= $id</code> 
    where `$id` is the `user_ID` we got earlier.
    

     `$id`
     `user_ID`
    

    也不匹配

    `post_name`?
    

    这需要是一个只有regex的解决方案。我了解并知道如何使用 preg_replace_callback 等移除 <code> 先从字符串中删除块,但我正在寻找一个只有regex的解决方案。此外,它还需要能够处理可能的属性,如 <code lang="php">

    正则表达式需要 匹配不在 <代码> </code> 火柴呢 <代码> < 在其他上下文中处理孤立的backticks。

    背面记号中的内容永远不会是多行的。

    推理

    <代码>

    另外,我不想要“usesimplexml”答案的部分原因是因为backticks不在实际值中 <代码> <代码>

    1 回复  |  直到 14 年前
        1
  •  6
  •   Mark Byers    14 年前

    `(?:(?!</?code>)[^`])*`(?!(?:(?!<code>).)*</code>)
    

    `(?:(?!</?code>)[^`])*`       : Match something in backticks unless it
                                    contains <code> or </code> or a backtick...
    (?!(?:(?!<code>).)*</code>)   : unless it is followed by a </code>
                                    without a <code> first.
    

    请参见 rubular .