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

PHP正则表达式-删除标记之间的文本,php,regex,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); $text=”文本的h

我有这个:

$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); 
$text=”文本的html标记
ss adsda sdsa
oshte文本s html tagove';

$content=preg_replace('/()[^最好使用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;
$html=query(“//div[@id='content']”);
对于($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>

文本的html标记

oshte文本的html标记 这里有更多的文字
您可以使用

根据评论更新

[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 ~]$ 
[ghoti@pc~]$cat doit.php

如果有多个标记,您想删除什么文本?不要用正则表达式解析HTML。使用PHP中的一个解析器。我不会用STFU来说明您的需要。这是个不好的词。@MarcelloGrechiLins-我相信他们可能会有不同的想法!;-)只有当没有像示例中那样的属性时,它才与div标记匹配。而且它不会工作,例如
ss adsda sdsa
,-1.不要用正则表达式解析HTML。@Qtax-如果您有可预测的输入,并且问题在正则表达式可以处理的范围内,那么用正则表达式解析HTML没有问题。OP担心姆贝迪,不是嵌入式的s.@JonathanKuhn-这个例子是一个懒惰量词的简单演示。但是好吧,我会在OP的原始preg_替换中添加一个修正作为一个更新。我同意。这是有效的,它解决了OP的问题。如果在RE中处理HTML是一个坏主意,也许这是对这个问题的否决票,但对t来说不是他回答。@Qtax:很高兴你至少留下了一条评论供否决投票。如果你能告诉我为什么更糟,我会非常感激。你回答中的代码不起作用,甚至无法解决问题,请再次阅读该问题。(提示:他在嵌套标记方面有问题。)啊,废话,你是对的。然而,这个嵌套标记的东西本来就不存在,当我发布这个答案时。我自己一直在写各种问题,不使用正则表达式进行HTML解析(你可以在我的答案上看到我的警告),现在它又来咬我:)@Qtax:我编辑并发布了一个基于DOM的代码来删除div标记。
$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 ~]$