0

你好吗?我会直奔主题。

我正在使用一个递归正则表达式,它基本上删除了单个或嵌套的 <blockquote> tags。我只需要删除普通的 <blockquote> ... </blockquote> 文本,无论是否嵌套,并留下这些之外的任何内容。

这个正则表达式完全按照我的意愿完成工作(注意使用前瞻和递归)

$comment=preg_replace('#<blockquote>((?!(</?blockquote>)).|(?R))*</blockquote>#s',"",$comment);

但它有一个大问题:当 $comment 很大(超过 3500 个字符长)时,apache 崩溃(我假设分段错误)。

我需要一个解决问题的方法,但要解决崩溃,使用更好的正则表达式自定义函数也可以完成这项工作。

如果您只是对如何删除嵌套的特定标签有想法,我们欢迎您。

先感谢您

4

1 回答 1

1

伙计,你的模式会像疯了一样出现错误!即使是几百字节的注释也会以崩溃告终。

使用 preg_split() 拆分字符串要简单得多,然后使用计数器来跟踪您的深度。而当深度大于 1 时,您将丢弃文本。这是实现:

$tokens = preg_split('#(</?blockquote.*?>)#s', $comment, -1, PREG_SPLIT_DELIM_CAPTURE); 
$outsideTokens = array();
$depth = 0;
for($token = reset($tokens); $token !== false; $token = next($tokens)) { 
    if($depth == 0) {
        $outsideTokens[] = $token;
    }
    $delimiter = next($tokens);
    if($delimiter[1] == '/') {
        $depth--;
    } else {
        $depth++;
    }
}
$comment = implode($outsideTokens);

即使开始标记包含属性,代码也应该可以工作。

于 2012-08-11T00:38:13.313 回答