首先要做的事情。我知道如何使用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>
块的解决方案可以稍作修改。
答案 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处的正则表达式。