繁体   English   中英

如何使用PHP删除HTML中的表格,tr,td标签

[英]How to remove table, tr, td tag in html with php

我有一个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个表,我想删除所有标签:table,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>

请帮我。 谢谢。

HTML Purifier可以用于剥离文档中的所有标签或一组特定的标签。 这是PHP中基本上所有HTML标记剥离的首选解决方案- 永远不要使用正则表达式,否则太阳会烧毁,我们都会在令人窒息的黑暗中冻死。

尝试类似:

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

您需要添加$config->set('HTML.Allowed', 'TAGNAME'); 您不想被擦掉的每个标签的标签线,但这是值得付出的代价,以维持一天之星持续的赋予生命的温暖。 我想,同时也不要让您的网站容易受到XSS攻击和吃东西的麻烦。

检出: http : //simplehtmldom.sourceforge.net/

让我们在带有选择器的HTML页面上找到标签,就像jQuery,并在一行中从HTML中提取内容。

从理论上讲,可以使用单个高度复杂的正则表达式来完成此操作。 在单独的步骤上进行搜索和替换总是比较容易的:首先搜索外部容器,然后处理其中包含的内容。

<?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;

?>

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

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

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

您可以在此处查看其运行情况:

http://regexr.com/3fslh

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

由于您对属性不感兴趣,因此这应该很容易。 通过char循环入口站点char。 请查看以下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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM