【问题标题】:How to remove HTML tag if it contains specific string [closed]如果 HTML 标记包含特定字符串,如何删除它[关闭]
【发布时间】:2018-04-28 19:38:11
【问题描述】:
    <tr>
        <td width="300" bgcolor="#cccccc" style="text-align: right;">
         <strong>&nbsp;&nbsp;&nbsp;Sometext<br />
         </strong>
        </td>
        <td width="125" bgcolor="#009900" style="text-align: center;">
         <strong><span style="color: rgb(255, 255, 255);">
          <span style="font-size: larger;">Pricetoreplace</span>
          </span>
         </strong>
        </td>
    </tr>

如果其中包含“Pricetoreplace”文本,我需要删除整个 &lt;tr&gt;....&lt;/tr&gt; 行。 我试过了:

$content = preg_replace('~(<tr.*[\'"]Pricetoreplace[\'"].*tr>)~', '', $content);

但是没用。

【问题讨论】:

  • “它没有用”是什么意思?有错误吗?它没有删除任何东西吗?
  • 你应该永远用正则表达式解析 HTML。请改用a PHP DOM parser
  • @gtktuf 首先,您将替换从第一个实例到最后一个实例的所有内容 tr&gt; 所以您的正则表达式不会按照您的预期进行(您使用贪婪的量词 .*惰性量词.*?)。其次,您的. 不匹配换行符,您应该使用[\s\S] 代替或打开s 标志以将换行符与. 字符匹配。不过,您甚至不应该为此使用正则表达式。
  • @gtktuf 你真的应该使用类似this question 的东西。
  • @gtktuf 是的。使用正则表达式解析 HTML 或 XML 通常是不好的做法。只有当它是已知子集时,Regex 才应该用于解析 HTML 或 XML。在你的情况下,它似乎并非如此。我建议您使用 HTML/XML 解析器并让它为您完成繁重的工作。

标签: php html regex dom tags


【解决方案1】:

一种方法是使用xpath 查询:

*//td[contains(., 'Pricetoreplace')]/parent::tr

在这里,我们查找text() 属性包含Pricetoreplacetd,然后查找相应的父tr。后者将从DOM 中删除。


PHP:
<?php

$html = <<<DATA
    <tr><td class="some other class">some text here</td></tr>
   <tr>
        <td width="300" bgcolor="#cccccc" style="text-align: right;">
         <strong>&nbsp;&nbsp;&nbsp;Sometext<br />
         </strong>
        </td>
        <td width="125" bgcolor="#009900" style="text-align: center;">
         <strong><span style="color: rgb(255, 255, 255);">
          <span style="font-size: larger;">Pricetoreplace</span>
          </span>
         </strong>
        </td>
    </tr>
DATA;

# set up the DOM
$dom = new DOMDocument();
$dom->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);

# set up the xpath
$xpath = new DOMXPath($dom);

foreach ($xpath->query("*//td[contains(., 'Pricetoreplace')]/parent::tr") as $row) {
    $row->parentNode->removeChild($row);
}
echo $dom->saveHTML();
?>


这产生
<tr><td class="some other class">some text here</td></tr>

【讨论】:

  • 这就是答案,但就我而言,我需要替换:$dom-&gt;loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);$dom-&gt;loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8')); 以解决一些编码问题。并且在整个帖子中没有像:class="some other class" 这样的类,我需要用这个 php 脚本重建——这是主要问题。 Ty 表示此方法。
  • @gtktuf:很高兴为您提供帮助。
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 2011-02-25
  • 2020-04-08
  • 2016-12-06
  • 2021-03-17
  • 2022-11-27
  • 2015-01-14
  • 1970-01-01
相关资源
最近更新 更多