PHP正则表达式 - 删除标签之间的文本

时间:2012-03-09 21:54:54

标签: php regex

我有这个:

$text = 'text text text s html tagove
<div id="content">ss adsda sdsa </div>
oshte text s html tagove';
$content = preg_replace('/(<div\sid=\"content\">)[^<]+(<\/div>)/i', '', $text);
var_dump($content); 

但如果<div id="content"></div>包含其他代码,例如<b><i>等,则无效。

例如:

$text = 'text text text s html tagove
<div id="content"><b> stfu </b> ss adsda sdsa </div>
oshte text s html tagove';

2 个答案:

答案 0 :(得分:4)

您可以改为使用lazy quantifiers

$s="foo<div>Some content is <b>bold</b>.</div>bar\n";

print preg_replace("/<div>.+?<\/div>/i", "", $s);'

输出:

foobar
每条评论

更新

[ghoti@pc ~]$ cat doit.php 
<?php

$text = 'text text text s html tagove
<div id="content"><b> stfu </b> ss adsda sdsa </div>
oshte text s html tagove';

print preg_replace('/<div id="content">.+?<\/div>/im', '', $text) .  "\n";

[ghoti@pc ~]$ php doit.php 
text text text s html tagove

oshte text s html tagove
[ghoti@pc ~]$ 

答案 1 :(得分:2)

最好使用DOM来处理HTML文本解析。这是一个基于DOM的代码,用于删除div标签:

$html = <<< EOF
text text text s html tagove
<div id="content">ss <div>abcd</div>adsda sdsa </div>
oshte text s html tagove
<div id="content">foo <div>bar</div>baz foo</div>
some more text here
EOF;

$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$nlist = $xpath->query("//div[@id='content']");
for($i=0; $i < $nlist->length; $i++) {
   $node = $nlist->item($i);
   $node->parentNode->removeChild($node);
}
$newHTML =  $doc->saveHTML();
echo $newHTML;

感谢@Qtax指出我原来的问题在我写完之前基于正则表达式的答案后发生了变化。

<强>输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>text text text s html tagove
</p>
oshte text s html tagove

some more text here</body></html>