正则表达式:如果内部没有数据,则用<tag>替换<div>标签的内容

时间:2016-04-29 16:11:37

标签: php html

代码:

    <div>
      <font face="Arial, Verdana">
         <span style="font-size: 13.3333px;">
           <u>
             Hello World
           </u>
       </span>
    </font>
 </div>
    <div>
      <font face="Arial, Verdana">
         <span style="font-size: 13.3333px;">
           <u>
            Hello World2
           </u>
            <br>
       </span>
    </font>
 </div>
 <div>
    <br>
 </div>
 <div>
      <font face="Arial, Verdana">
        <span style="font-size: 13.3333px;">
           <u>
               <br>
            </u>
        </span>
      </font>
 </div>

输出: - 我希望获得与下面给出的完全相同的输出

    <div>
      <font face="Arial, Verdana">
         <span style="font-size: 13.3333px;">
            <u>
             Hello World
            </u>
          </span>
       </font>
     </div>
    <div>
      <font face="Arial, Verdana">
         <span style="font-size: 13.3333px;">
           <u>
            Hello World2
           </u>
            <br>
       </span>
    </font>
 </div>
 <br>
 <br>

以下是我的尝试:

$html = preg_replace("/<div.*?>.*?<br.*?>.*?<\/div>/", "", $html);

但它运作不正常。

请查看代码,并建议我如何在“div”标签下没有文字时,用“br”标签将“div”标签从其起始标签替换为相应的结束标签。如上面第二个“div”标签所示。

2 个答案:

答案 0 :(得分:2)

使用domDocument来操作html结构

$doc = new DOMDocument();
$doc->loadHtml($pageHtml);
$x = new DOMXpath($doc);
foreach($x->query('//div[normalize-space(.) = ""]') as $div) {
    $link= $doc->createElement('br');
    $div->parentNode->replaceChild($link, $div);
}

echo $doc->saveHTML();

demo

答案 1 :(得分:1)

我强烈建议使用DOM Manipulation来完成此任务。您可以使用正则表达式,可以使其他解决方案有效。但是,DOM操作是出于这个原因而创建的。

PHP中有很多DOM解析器的例子。有些比其他人慢。查看this SO post,了解DOM解析器潜在候选者的绝佳列表。

您可以随时使用正则表达式 - 但这是我个人使用正则表达式的条件:如果您从未计划向此添加任何其他功能。如果您计划添加更多,更改它,使您的脚本更通用等等,那么我会说不要使用RegEx。原因是你最终会得到一个巨大的,完全令人生畏的表达,或者你最终会得到许多小的“一次性”表达。引用DOM Parser中的函数所需的时间比找出正确的正则表达式要少。

编辑:

我删除了我的代码段 - Splash58's answer是一个更优雅的解决方案。他的例子使用原生PHP,其中9.9倍(更快,更高效,更多社区支持等)。