Php 仅匹配背面标记,不在a内<;代码>;带正则表达式的块
第一件事。我知道如何用simplexml解析XML/HTML,我知道所有反对使用正则表达式解析它的论点。这个问题是为了知识 需要做什么 在文本块中,假设我们有以下一行文本:Php 仅匹配背面标记,不在a内<;代码>;带正则表达式的块,php,regex,parsing,Php,Regex,Parsing,第一件事。我知道如何用simplexml解析XML/HTML,我知道所有反对使用正则表达式解析它的论点。这个问题是为了知识 需要做什么 在文本块中,假设我们有以下一行文本: 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`
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\u replace\u callback
等方法首先从字符串中删除
块,但我正在寻找一种只使用正则表达式的解决方案。此外,它还需要能够处理可能的属性,如
正则表达式需要匹配不在
和
之间的反勾号对,并且匹配的可能不包含
或
以在其他上下文中处理单独的反勾号
背景标记中的内容永远不会是多行的。
推理
我正在做一个私人项目,这可能是一个边缘案例。这不是可以更改调用顺序的标记类型项目。
标记位于源文本中,不在任何地方
另外,我不想要“使用simpleXML”答案的部分原因是因为反勾号不在实际的
块中。这只是一种解释问题的简便方法,块的解决方案只需稍加修改即可工作。我认为正则表达式不是解决这一问题的好工具,但如果您假定代码标记不是嵌套的,则可以这样做:
`(?:(?!</?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.
查看位于的正则表达式。我不认为正则表达式是实现这一点的好工具,但如果您假定代码标记没有嵌套,则可以这样做:
`(?:(?!</?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.
另一方面,我不希望“use simpleXML”回答的部分原因是因为反勾号不在实际的块中。“-DOM解析器将这些视为文本节点,您可以通过它们进行枚举并执行regexing。没有任何类型的DOM解析器<代码>
也可以是纯文本,比如happy
,
也可以是sad
。你唯一知道的是开始和结束“标记”是什么,它们是不同的。是否有不匹配、重叠或嵌套的
标记,标记位于应该忽略的背景标记、注释、字符串或节中,或者其他我们应该注意的特殊情况?为了回答这个问题,我会说这是一片神奇的土地,那里一切都是理想的。唯一不应该匹配的特殊情况是,如果反勾号对包含
或
,因为这意味着存在偏移量问题。“另外,我不想使用“use simpleXML”回答的部分原因是因为反勾号不在实际的块内。”-DOM解析器将它们视为文本节点,您可以通过它们进行枚举并执行regexing。没有任何类型的DOM解析器<代码>
也可以是纯文本,比如happy
,
也可以是sad
。你唯一知道的是开始和结束“标记”是什么,它们是不同的。是否有不匹配、重叠或嵌套的
标记,标记位于应该忽略的背景标记、注释、字符串或节中,或者其他我们应该注意的特殊情况?为了回答这个问题,我会说这是一片神奇的土地,那里一切都是理想的。唯一不应该匹配的特殊情况是,如果反勾号对包含
或
,因为这意味着存在偏移问题。完美。我要做的唯一更改是将
替换为[\s\s]
以处理多行
块。我知道它们不是最好的工具,但我很想知道它是如何实现的。不用担心,它不会出现在项目中您可以简单地将s
修饰符(PCRE\u DOTALL
)设置为完美,而不是使用[\s\s]
。我要做的唯一更改是将
替换为[\s\s]
以处理多行
块。我知道它们不是最好的工具,但我很想知道它是如何实现的。不用担心,它不会出现在项目中您可以简单地设置s
修饰符(PCRE\u DOTALL
),而不是使用[\s\s]
)