首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >被PHP preg_replace阻碍

被PHP preg_replace阻碍
EN

Stack Overflow用户
提问于 2012-08-20 19:26:37
回答 2查看 88关注 0票数 0

以下preg_replace出现问题:

代码语言:javascript
复制
$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 class="main"> <div class="block_bc"></div> </div>结束,但它没有被选中。

谁能给我指出一个“明显”的错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-20 19:34:45

您尝试错误地使用字符类([])。[^<\/div>]*部分表示除以下字符之外的字符数:</div>。这可能不是你的意思。

您可以使用的是non-greedy repeat

代码语言:javascript
复制
$regex = '/(<div\s*class=\"block_bc\"[^>]*>)(.+?)(<\/div>)/is';

此外,使用regexp从html中获取内容可能非常脆弱,请尝试在xpath中使用DOM。它更冗长,但对格式不佳的输入也更具弹性:

代码语言:javascript
复制
$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>
票数 1
EN

Stack Overflow用户

发布于 2012-08-20 19:36:45

^只创建一个没有'<‘、'/’、'd‘、'i’、'v‘和'>’的字符类。它没有做你认为它会做的事情。将中间部分替换为非贪婪的任意匹配应该可以做到这一点:

代码语言:javascript
复制
'/(<div\sclass=\"block_bc\"[^>]*>)(.*?)(<\/div>)/is'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12036794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档