【问题标题】:How to remove table, tr, td tag in html with php如何使用php删除html中的table、tr、td标签
【发布时间】:2012-08-15 03:57:36
【问题描述】:

我有一个html代码:

<table id="table1" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
  <tr>
    <td>
    <img src="http://vnexpress.net/Files/Subject/3b/bd/ac/f9/cuongbibat.jpg" width="330" height="441" border="1" alt="C&#432;&#7901;ng">
    </td>
  </tr>
  <tr>
    <td class="Image">Everything
   </td>
  </tr>
</table>
 <table id="table2" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
      <tr>
        <td>
        Someone
        </td>
      </tr>
      <tr>
        <td class="Image">Everything
       </td>
      </tr>
    </table>

我有 2 个表,我想删除所有标签:表、tr、td 如果表有 img 标签(表 1)。 我需要得到类似的结果:

     <img src="http://vnexpress.net/Files/Subject/3b/bd/ac/f9/cuongbibat.jpg" width="330" height="441" border="1" alt="C&#432;&#7901;ng">
        Everything


     <table id="table2" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
          <tr>
            <td>
            Someone
            </td>
          </tr>
          <tr>
            <td class="text">Everything
           </td>
          </tr>
        </table>

请帮助我。谢谢。

【问题讨论】:

  • 您是否尝试过回应评论? &lt;?='&lt;!--'?&gt; & &lt;?='--&gt;'?&gt;?

标签: php html regex


【解决方案1】:

HTML Purifier 可用于从文档中删除所有标签或特定标签集。它是 PHP 中基本上任何 HTML 标签剥离的首选解决方案 - 永远不要为此使用正则表达式,否则太阳会燃烧,我们都会在令人窒息的黑暗中冻死。 p>

尝试类似:

$config->set('HTML.Allowed', 'img');
$purifier = new HTMLPurifier($config);
$output = $filter->purify($YOUR_HTML);

您需要为每个不想被删除的标签添加一个$config-&gt;set('HTML.Allowed', 'TAGNAME'); 行,但这是值得为白昼之星的持续生命温暖付出的代价。我猜,也不要让您的网站遭受 XSS 攻击和内容吞噬故障。

【讨论】:

    【解决方案2】:

    查看: http://simplehtmldom.sourceforge.net/

    让您在 HTML 页面上使用选择器(如 jQuery)查找标签,并在一行中从 HTML 中提取内容。

    【讨论】:

      【解决方案3】:

      理论上,使用一个高度复杂的正则表达式就可以做到这一点。在单独的步骤中进行搜索和替换总是更容易:首先搜索外部容器,然后处理它包含的内容。

      <?php 
      
      header("Content-type: text/plain");
      
      $html = '<table id="table1" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
        <tr>
          <td>
          <img src="http://vnexpress.net/Files/Subject/3b/bd/ac/f9/cuongbibat.jpg" width="330" height="441" border="1" alt="C&#432;&#7901;ng">
          </td>
        </tr>
        <tr>
          <td class="Image">Everything
         </td>
        </tr>
      </table>
       <table id="table2" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
            <tr>
              <td>
              Someone
              </td>
            </tr>
            <tr>
              <td class="Image">Everything
             </td>
            </tr>
          </table> ';
      
      
      $html = preg_replace_callback('/<table\b[^>]*>.*?<\/table>/si', 'removeTableIfImg', $html);
      
      function removeTableIfImg($matches) {
          $table = $matches[0];
          return preg_match('/<img\b[^>]*>/i', $table, $img) 
               ? preg_replace('/<\/?(?:table|td|tr)\b[^>]*>\s*/i', '', $table)
               : $table;
      }
      echo $html;
      
      ?>
      

      第一个模式找到表。第二个模式(在回调中)检查是否有图像标签。第三个删除 table、td 和 tr 标签。

      【讨论】:

      • 谢谢你,但使用它时没有任何反应。 $s="我的html代码"; $s = preg_replace_callback('/]*>.*?/si', 'removeTableIfImg', $s);函数 removeTableIfImg($matches) { $table = $matches[0];返回 preg_match('/]*>/i', $table, $img) ? preg_replace('/]*>[\s+]*/', '', $table) : $table; } var_dump($s);死();它使用 2 个表格标签打印所有内容:(
      • 我刚试了一下,效果很好。最后一个表达式可能应该不区分大小写,顺便说一句。
      • 我不知道为什么我的代码不起作用:(。你能给我你的代码吗?
      【解决方案4】:

      我需要这样的东西。 这是我的解决方案: (&lt;\/?tr.*?&gt;)|(&lt;\/?td.*?&gt;)|(&lt;\/?table.*?&gt;)

      这个正则表达式将选择所有不贪婪的 tr td 和 table 标签。

      你可以在这里看到它的实际效果:

      http://regexr.com/3fslh

      【讨论】:

        【解决方案5】:

        正如 sudowned 所说,不要为此使用正则表达式,它会让你发疯。通常搜索库所消耗的时间与为此编写自己的小型解析器所花费的时间相同。我用不同的语言做了几次。你学到了很多东西,而且你经常可以重用代码:-)

        由于您对属性不感兴趣,这应该很容易。逐个字符循环进入站点。看看这个 java 代码,它是我早期的、更小的清理 html 的方法之一:

        public static String sanatize(String body, String[] whiteList, String tagSeperator, String seperate) {
            StringBuilder out = new StringBuilder();
            StringBuilder tag = new StringBuilder();
        
            boolean quoteOpen = false;
            boolean tagOpen = false;
            for(int i=0;i<body.length();i++) {
                char c = body.charAt(i);
                if(i<body.length()-1 && c == '<'  && !quoteOpen && body.charAt(i+1) != '!') {
                    tagOpen = true;
                    tag.append(c);
                } else if(c == '>'  && !quoteOpen && tagOpen) {
                    tag.append(c);
        
                    for (String tagName : whiteList) {
                        String stag = tag.toString().toLowerCase();
                        if (stag.startsWith("</"+tagName+" ") || stag.startsWith("</"+tagName+">") || stag.startsWith("<"+tagName+" ") || stag.startsWith("<"+tagName+">")) {
                            out.append(tag);
                        } else if (stag.startsWith("</") && tagSeperator != null) {
                            if (seperate.length()>2) {
                                if (seperate.contains("," + stag.replaceAll("[</]+(\\w+)[\\s>].*", "$1") + ",")) {
                                    out.append(tagSeperator);
                                }
                            } else {
                                if (!out.toString().endsWith(tagSeperator)) {
                                    out.append(tagSeperator);
                                }
                            }
                        }
                    }
        
                    tag = new StringBuilder(); 
                    tagOpen = false;
                } else if (c == '"' && !quoteOpen) {
                    quoteOpen = true;
                    if (tagOpen)
                        tag.append(c);
                    else 
                        out.append(c);
                } else if (i>1 && c == '"' && quoteOpen && body.charAt(i-1) != '\\' ) {
                    quoteOpen = false;
                    if (tagOpen)
                        tag.append(c);
                    else 
                        out.append(c);
                } else {
                    if (tagOpen)
                        tag.append(c);
                    else 
                        out.append(c);
                }
            }
        
            return out.toString();
        }
        

        你可以忽略分隔符和分隔符,我用它来清理标签并转换为 csv

        【讨论】:

        • 这是 Java。问题是关于 php 的。
        • 是的,它的 java,但程序员应该能够将这个概念从 java 翻译成 php
        • 这个概念是错误的。在 DOM 操作的上下文中,搜索和替换几乎与正则表达式一样错误。这就像通过解释如何点燃汽车来帮助 OP 修理他的汽车。在克林贡。
        猜你喜欢
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 2015-02-11
        • 2019-05-27
        • 2017-11-05
        • 2015-02-21
        • 2015-04-12
        • 2019-11-29
        相关资源
        最近更新 更多