-3

给定以下字符串:

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

我想删除&nbsp;s 内的所有 's <div>,结果是:

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

我可以使用任何标准的 PHP 东西,但我不确定如何解决这个问题。我不知道如何<div>在删除 s 时将内容保留在&nbsp;

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

4

3 回答 3

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> 
于 2013-05-03T07:12:15.557 回答
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 是嵌套的,它将无法按预期工作;
  • 它只应用一次替换 a &nbsp;,因此 div 内的多个&nbsp;s 保持不变。

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

于 2013-05-03T07:18:01.400 回答
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;
于 2013-05-03T07:26:06.273 回答