regexp php中的错误

regexp php中的错误,php,regex,Php,Regex,这段代码有个错误,我找不到。我需要缺少的字符是什么 preg_replace(/<(?!\/?(?:'.implode('|',$white).'))[^\s>]+(?:\s(?:(["''])(?:\\\1|[^\1])*?\1|[^>])*)?>/','',$html); preg\u replace(/]+(?:\s(?([“”))(?:\\\1[^\1])*?\1[^>])*)?>/,“,”$html); 除其他事项外,您似乎缺少一个报价: preg_repla

这段代码有个错误,我找不到。我需要缺少的字符是什么

preg_replace(/<(?!\/?(?:'.implode('|',$white).'))[^\s>]+(?:\s(?:(["''])(?:\\\1|[^\1])*?\1|[^>])*)?>/','',$html);
preg\u replace(/]+(?:\s(?([“”))(?:\\\1[^\1])*?\1[^>])*)?>/,“,”$html);

除其他事项外,您似乎缺少一个报价:

preg_replace('/<(?!\/?(?:' . implode('|',$white) . '))[...
             ^
             here!

preg_replace('/除其他事项外,您似乎缺少一个报价:

preg_replace('/<(?!\/?(?:' . implode('|',$white) . '))[...
             ^
             here!

preg\u replace('/帮个忙,用代替正则表达式来解析HTML到。

帮个忙,用代替正则表达式来解析HTML到。

好吧,这部分是错误的:

(["'])(?:\\\1|[^\1])*?\1
这应该与包含在单引号或双引号中的序列相匹配,可能包括反斜杠转义引号。但它不起作用,因为反引用在字符类中不起作用。
\1
被视为八进制表示法中的数字
1
,因此
[^\1]
匹配除字符外的任何字符

如果它在大多数情况下都有效,那是因为不情愿使用量词(
*?
)。在
(?:\\\1 |[^\1]中的第一种选择*?
正确地使用转义引号,但在其他情况下,它只是不情愿地匹配任何字符,直到它看到一个未转义的引号。它在格式良好的文本上工作正常,但如果再加上一个引号,它就会失控

匹配“除捕获哪一组之外的任何内容”的正确方法是
(?:(?!\1)。)*
-也就是说,一次使用一个字符,但前提是先行检查确认它不是捕获文本的第一个字符。但我认为您最好分别处理每种引用;这个正则表达式已经够复杂了

'~<(?!/?+(?:'.implode('|',$white).')\b)[^\s>]++(?:\s++'.
'(?:[^\'">]++|"(?:[^"\\]++|\\")*+"|\'(?:[^\'\\]++|\\\')*+\')*+)?+>~'
“~]++(?:\s++”。
'(?:[^\'">]++|"(?:[^"\\]++|\\")*+"|\'(?:[^\'\\]++|\\\')*+\')*+)?+>~'
请注意,在白名单更改之后添加了
\b
(单词边界)。如果没有白名单更改,如果列表中有(例如)
,您将无意中白名单
标记

我还到处使用所有格量词(
*++
++
?++
),因为这个正则表达式的编写方式,我知道回溯永远不会有用。如果它要失败,我希望它尽快失败


既然我已经告诉了你如何使用正则表达式,我劝你不要使用它。这项工作太复杂太重要了,不能用像正则表达式这样不合适的工具来完成。如果你真的从一本关于PHP安全性的书中得到了正则表达式,我建议你拿回你的钱。

好吧,这部分是错误的:

(["'])(?:\\\1|[^\1])*?\1
这应该与包含在单引号或双引号中的序列相匹配,可能包括反斜杠转义引号。但它不起作用,因为反引用在字符类中不起作用。
\1
被视为八进制表示法中的数字
1
,因此
[^\1]
匹配除字符外的任何字符

如果它在大多数情况下都有效,那是因为不情愿使用量词(
*?
)。在
(?:\\\1 |[^\1]中的第一种选择*?
正确地使用转义引号,但在其他情况下,它只是不情愿地匹配任何字符,直到它看到一个未转义的引号。它在格式良好的文本上工作正常,但如果再加上一个引号,它就会失控

匹配“除捕获哪一组之外的任何内容”的正确方法是
(?:(?!\1)。)*
-也就是说,一次使用一个字符,但前提是先行检查确认它不是捕获文本的第一个字符。但我认为您最好分别处理每种引用;这个正则表达式已经够复杂了

'~<(?!/?+(?:'.implode('|',$white).')\b)[^\s>]++(?:\s++'.
'(?:[^\'">]++|"(?:[^"\\]++|\\")*+"|\'(?:[^\'\\]++|\\\')*+\')*+)?+>~'
“~]++(?:\s++”。
'(?:[^\'">]++|"(?:[^"\\]++|\\")*+"|\'(?:[^\'\\]++|\\\')*+\')*+)?+>~'
请注意,在白名单更改之后添加了
\b
(单词边界)。如果没有白名单更改,如果列表中有(例如)
,您将无意中白名单
标记

我还到处使用所有格量词(
*++
++
?++
),因为这个正则表达式的编写方式,我知道回溯永远不会有用。如果它要失败,我希望它尽快失败


既然我已经告诉了你如何使用正则表达式,我劝你不要使用它。这项工作太复杂,太重要了,不能用像正则表达式这样不合适的工具来完成。如果你真的从一本关于PHP安全性的书中得到了正则表达式,我建议你拿回你的钱。

你有什么错误,结果中有什么不正确的地方,以及最重要的错误是什么重要的是,你想实现什么?他试图用PHP解析HTML!让他!下面提到的AulCule,我建议你不要用ReGEX进行HTML解析。它只是在请求麻烦和痛苦。@ M28,这是来自一个PHP安全开发书,它将除去所有的标签,除了白名单。如果你在解析用户输入,那么你就应该逃出<和>。你有什么错误,结果中什么是错误的,最重要的是你想要达到什么?他正在试图用PHP解析HTML!抓住他!正如下面的AcCule所提到的,我建议你不要用ReGEX进行HTML解析。它只是在自找麻烦和痛苦。@ M28,这是来自A。PHP安全开发手册,将除去除白名单以外的所有标记。如果您正在解析用户输入,那么您应该只转义<和>。我从PHPbook@proyb2那你应该买一本更新的书。这是个糟糕的建议。我从一个PHP网站上了解到了这一点book@proyb2那你应该买一本更新的书。那是个糟糕的建议。