使用PHP,如何在一定数量的之后/之前删除HTML文本

时间:2012-08-24 03:57:54

标签: php html-parsing domdocument html-manipulation

使用PHP,如何删除在一定数量的<br>标签之前/之后放置的HTML文本?

例如,我有这个,

<div>
    <div><img sec=""></div>
    <br>
    <h3>title</h3>
    <span>some text here</span>
    <br>
    Some text that I want to remove.
    <br>
    <br>
</div>

我想在最后两个<br>标记之前删除字符串。或者可以说是在第二个<br>之后。

我使用explode()尝试<br>,并使用array_push()省略了最后两个数组元素。但是,我必须添加</div>来关闭外部标记。当外部标签动态变化时,这不是一个好主意。

有人有解决方案吗?

4 个答案:

答案 0 :(得分:1)

除了Joshua的回答,如果你想以更简单的方式做到这一点,你可以使用简单的html dom库,可以在下面的链接中找到。只需浏览他们的文档。当您遇到现在的问题以及何时想要抓取网页内容时,这个库很多次都很方便。

http://simplehtmldom.sourceforge.net/

答案 1 :(得分:0)

您要做的是使用正则表达式进行字符串匹配,以便在两个<br>标记之前和之前的<br>标记之后获取文本。请参阅以下内容:

http://www.regular-expressions.info/php.html

答案 2 :(得分:0)

哦,这就是我所取得的成就。虽然这可能不是最有效的方式,但我会分享。我使用DOMinnerHTML()引入了here和preg_split()。这将删除最后三个<br>标记后的文本。

<?php 
$html = <<<STR
<div>
    <div><img sec=""></div>
    <br>
    <h3>title</h3>
    <span>some text here</span>
    <br>
    Some text that I want to remove.
    <br>
    <br>
</div>
STR;

$doc = new DOMDocument;
$doc->loadHTML($html);
$node = $doc->getElementsByTagName('div')->item(0);
$innerHtml = DOMinnerHTML($node);
$arrHtml = preg_split('/<br.*?\/?>/i', $innerHtml);     // devide the string into arrays by <br> or <br />
array_splice($arrHtml, -3);     // remove the last three elements   
$edited = implode(" ", $arrHtml);

echo $edited;

function DOMinnerHTML($element) 
{ 
    $innerHTML = ""; 
    $children = $element->childNodes; 
    foreach ($children as $child) 
    { 
        $tmp_dom = new DOMDocument(); 
        $tmp_dom->appendChild($tmp_dom->importNode($child, true)); 
        $innerHTML.=trim($tmp_dom->saveHTML()); 
    } 
    return $innerHTML; 
} 
?> 

答案 3 :(得分:0)

我做了以下事情:

function limitTag($str,$tag,$limit) {
  $array = explode($tag,$str);
  $newStr = '';
  $i=0;
  foreach ($array as $child){
    if ($i<=$limite){
      if ($i>0) $newStr .= $tag;
      $newStr .= $child;
      $i++;
    } else break;
  }
  return $newStr;
}