受到PHP preg_替换的阻碍

受到PHP preg_替换的阻碍,php,regex,preg-replace,Php,Regex,Preg Replace,以下预更换有问题: $subject = '<div class="main"> <div class="block_bc"> <a href="index.php?x_param=11" class="BC-1"> Gallery</a> / <a href="path/Title_Item/?x_param=17" class="BC-2"> Title Item</a> / <span class="BC-3"&

以下预更换有问题:

$subject = '<div class="main"> <div class="block_bc"> <a href="index.php?x_param=11" class="BC-1"> Gallery</a> / <a href="path/Title_Item/?x_param=17" class="BC-2"> Title Item</a> / <span class="BC-3"> Bridge</span> </div> </div>';
$regex = '/(<div\sclass=\"block_bc\"[^>]*>)([^<\/div>]*>)(<\/div>)/is';   
$replacement = '<div class="block_bc"></div>';
preg_replace($regex, $replacement, $subject);
基本上,我想结束,但它不是被选中

谁能告诉我明显的错误吗?

模式

~<div\sclass="block_bc"[^>]*>.*</div>~isU
将一直工作,直到您在block_bc中添加一些div。

您试图错误地使用字符类[]。[^]*部分表示除以下之一之外的字符数:。这可能不是你的意思

您可以使用的是:

此外,使用regexp从html中获取信息可能非常脆弱,请尝试使用DOM和xpath来实现这一点。它更加冗长,但对于格式错误的输入也更具弹性:

$subject = '<div class="main"> <div class="block_bc"> <a href="index.php?x_param=11" class="BC-1"> Gallery</a> / <a href="path/Title_Item/?x_param=17" class="BC-2"> Title Item</a> / <span class="BC-3"> Bridge</span> </div> </div>';

libxml_use_internal_errors(true); // supress warnings
$doc = new DOMDocument;
$doc->loadHTML($subject);

$xpath = new DOMXpath($doc);
// get the <div class="main"> node for exporting
$main_node  = $xpath->query('//div[@class="main"]');
// select the block_bc classed div's childs, and the textnodes under it
$childNodes = $xpath->query('//div[@class="block_bc"]/* | //div[@class="block_bc"]/text()'); 
foreach ($childNodes as $c) {
    $c->parentNode->removeChild($c); // clear them all
}

// export the part of the document under the <div class="main">
print $doc->saveHTML($main_node->item(0)); 
// update:
// if you want the full document in html you can simply omit the parameter, with this you can get rid of the $main_node = ... line too
print $doc->saveHTML(); // this will print from doctype to </html>
[^]只是创建了一个字符类,而没有。它没有做你认为它会做的事情。将中间部分替换为非贪婪的任何匹配项都可以:

'/(<div\sclass=\"block_bc\"[^>]*>)(.*?)(<\/div>)/is'

请停止使用正则表达式解析html。这不是特别有用,因为您没有在答案中添加替代解决方案。你能这样做吗?谢谢。我会在以后的某个时候记住的。关闭。。。但是,+?,和其他类似的,当它遇到一个空格时,会掉下来。我知道。应该是指每个字符,但它似乎是我服务器上除了空格以外的所有字符。这听起来确实很奇怪。我猜这不是完整的输入换行符或删除的更多内容,请尝试对多行匹配也使用m修饰符。我不确定您的原始输入,但简单的换行符应该已经包含在s中了。您也可以像?:.|\s+那样编写它?明确地说应该使用空格,但我不能复制你的。不匹配的空间结果。更新看起来不错,但您可以修改它,以便在打印时打印整个HTML页面。我试着把$subject改成整版,但一路上迷路了。谈论DOM更新,即is.PS。你是个明星!?:.|\s+?我成功了!如果你不介意教我一点的话,我仍然对DOM感到好奇。我还是会接受答案的
'/(<div\sclass=\"block_bc\"[^>]*>)(.*?)(<\/div>)/is'