在div之间替换HTML实体,仅在div之间替换

时间:2013-05-03 06:45:07

标签: php string wordpress replace

给出以下字符串:

asd &nbsp; <div> def &nbsp; foo &nbsp; </div> ghi &nbsp; <div> moo &nbsp; </div>

我想删除&nbsp;内的所有<div>,导致:

asd &nbsp; <div> def  foo  </div> ghi &nbsp; <div> moo  </div>

我可以使用任何标准的PHP内容,但我不确定如何解决问题。在删除<div>

时,我无法弄清楚如何将内容保留在&nbsp;

我之所以需要这个,是因为WordPress的内容过滤器会在奇怪的情况下添加&nbsp;。我不能简单地删除所有&nbsp;,因为它们可能是由用户专门输入的,但是我需要删除由于它们导致显示问题的元素中的所有元素

3 个答案:

答案 0 :(得分:1)

      $text = "asd &nbsp; <div> def &nbsp; </div> ghi &nbsp; <div> moo &nbsp; </div>";
      echo preg_replace_callback(
                "#<div(.*?)>(.*?&nbsp;.*?)</div>#i",
                "filter_nbsp",
                $text);

                function filter_nbsp($matches)
    {

      return "<div".$matches[1].">" . str_replace("&nbsp;","",$matches[2]) . "</div>";
    }

这应该适用于关闭为</div>

的div元素之间的实体

输出

asd &nbsp; <div> def  </div> ghi &nbsp; <div> moo  </div> 

答案 1 :(得分:1)

以下适合您的情况:

$str = "asd &nbsp; <div> def &nbsp; </div> ghi &nbsp; <div> moo &nbsp; </div>";
$res = preg_replace("%<div>(.*?)&nbsp;(.*?)</div>%", "<div>$1$2</div>", $str);

但要注意一些事实:

  • 如果div具有属性,则无效;
  • 如果div是嵌套的,它将不会按预期工作;
  • 仅应用&nbsp;替换一次,因此div内的多个&nbsp;不受影响。

所以上述替代品根本不是一个好的解决方案。首先使用(XML)解析器函数找到div标签然后替换所有&nbsp;更好。

答案 2 :(得分:0)

simple_html_dom

    $html = str_get_html('asd &nbsp; <div> def &nbsp; </div> ghi &nbsp; <div> moo &nbsp; </div>');

foreach($html->find('div') as $element) {
      $a = $element->plaintext;
      $element->innertext = preg_replace('{\&nbsp;}','',$a);
}

echo $html;