Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅匹配背面标记,不在a内<;代码>;带正则表达式的块_Php_Regex_Parsing - Fatal编程技术网

Php 仅匹配背面标记,不在a内<;代码>;带正则表达式的块

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`

第一件事。我知道如何用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`
 `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]