首先要做的事情.我知道如何使用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.
Run Code Online (Sandbox Code Playgroud)
你如何匹配以下内容:
`$id`
`user_ID`
Run Code Online (Sandbox Code Playgroud)
没有匹配
`post_name`?
Run Code Online (Sandbox Code Playgroud)
要求
这需要是一个仅正则表达式的解决方案.我理解并知道如何使用类似的东西preg_replace_callback来<code>首先从字符串中删除块,但我正在寻找一个仅正则表达式的解决方案.此外,它需要能够处理可能的属性,如<code lang="php">.
正则表达式需要匹配不在<code>和之间的反对对,</code>并且匹配可能不包含任何<code></code>反引号或在其他上下文中处理单独的反引号.
反引号中的内容永远不会是多行的.
推理
我正在开展个人项目,这可能是一个边缘案例.这不是一个标记类型项目,可以更改调用的顺序.该<code>标签在源文本,而不是去任何地方.
另外,我不想"使用simpleXML"答案的部分原因是因为反引号不在实际<code>块内.这只是解释问题的一种方便方法,<code>块的解决方案可以稍作改动.
我不认为正则表达式是一个很好的工具,但如果你假设代码标签没有嵌套,它可以做到:
`(?:(?!</?code>)[^`])*`(?!(?:(?!<code>).)*</code>)
Run Code Online (Sandbox Code Playgroud)
这意味着:
`(?:(?!</?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中的正则表达式.