-1

私は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つのテーブルを持っています。テーブルにimgタグ(テーブル1)がある場合、テーブル、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">
        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>

私を助けてください。ありがとうございました。

4

5 に答える 5

4

HTML Purifierを使用して、ドキュメントからすべてのタグまたは特定のタグ セットを削除できます。これは、基本的に PHP で HTML タグを削除するための頼りになるソリューションです。これに正規表現を使用しないでください

次のようなものを試してください:

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

$config->set('HTML.Allowed', 'TAGNAME');消し去りたくないタグごとに行を追加する必要がありますが、昼の星の継続的な生命を与える暖かさのために支払う価値のある代償です. また、あなたのサイトを XSS 攻撃やコンテンツを食い尽くす不具合にさらさないでください。

于 2012-08-15T04:15:22.553 に答える
1

チェックアウト: http://simplehtmldom.sourceforge.net/

jQuery のようなセレクターを使用して HTML ページのタグを検索し、HTML からコンテンツを 1 行で抽出できます。

于 2012-08-15T04:16:40.227 に答える
0

理論的には、単一の非常に複雑な正規表現を使用してこれを行うことができます。検索と置換を別々のステップで実行する方が常に簡単です。最初に外部コンテナーを検索してから、そこに含まれているものを処理します。

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

?>

最初のパターンはテーブルを見つけます。2番目のパターン(コールバック内)は、画像タグがあるかどうかをチェックします。3つ目は、table、td、およびtrタグを削除します。

于 2012-08-15T08:20:54.923 に答える
-2

sudowned が言ったように、これには正規表現を使用しないでください。通常、ライブラリの検索には、独自の小さなパーサーを作成するのと同じ時間がかかります。これをさまざまな言語で数回行いました。あなたは多くのことを学び、コードを再利用することができます:-)

属性には関心がないので、これは非常に簡単なはずです。エントリ サイトを 1 文字ずつループします。この Java コードをチェックしてください。これは、HTML をサニタイズするための以前のより小さなアプローチの 1 つです。

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 に変換しました

于 2012-08-15T06:10:46.773 に答える