仅匹配<code> block with Regex</code>内的反引号

时间:2010-07-10 20:00:01

标签: php regex parsing

首先要做的事情。我知道如何使用simplexml解析XML / HTML,并且我知道所有反对使用RegEx来解析它的参数。这个问题是为了知识。

需要发生什么

在一段文字中,我们假设我们有以下文字:

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`?

要求

这需要是一个仅限正则表达式的解决方案。我理解并知道如何使用preg_replace_callback之类的东西来首先从字符串中删除<code>块,但我正在寻找一个仅使用正则表达式的解决方案。此外,它需要能够处理可能的属性,如<code lang="php">

正则表达式需要匹配不在<code></code> 之间的反对对,而匹配可能不包含<code>或{ {1}} 在其他情境中处理单独的反引号。

反引号中的内容永远不会是多行的。

推理

我正在开展个人项目,这是一个可能的边缘案例。这不是一个标记类型项目,可以更改调用的顺序。 </code>标签位于源文本中,不会转到任何位置。

另外,我不想“使用simpleXML”答案的部分原因是因为反引号不在实际的<code>块内。这只是解释问题的一种方便方法,<code>块的解决方案可以稍作修改。

1 个答案:

答案 0 :(得分:6)

我不认为正则表达式是一个很好的工具,但是如果你假设代码标签没有嵌套就可以做到:

`(?:(?!</?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处的正则表达式。