9

strip_tags()関数を使用していますが、いくつかのタグ (およびそのすべてのコンテンツ)を削除する必要があります。

例えば ​​:

<div>
  <p class="test">
    Test A
  </p>
  <span>
    Test B
  </span>
  <div>
    Test C
  </div>
</div>

たとえば、P タグと SPAN タグを削除して、次のものだけを残す必要があるとします。

<div>
  <div>
    Test C
  </div>
</div>

strip_tags2 番目のパラメーターとして、保持するタグが必要です。

この特定の例では使用できますstriptags($html, "<div>"); が、スクレイピングしている html と削除する必要があるタグは常に異なります。

ニーズに合った機能を何時間も探しましたが、役立つものは見つかりませんでした。

何か案は?

4

2 に答える 2

10

正規表現を使用します。このようなものが動作するはずです:

$tags = array( 'p', 'span');
$text = preg_replace( '#<(' . implode( '|', $tags) . ')>.*?<\/$1>#s', '', $text);

デモは、目的のタグを何も置き換えないことを示しています。

たとえば、タグ内の空白や、例が示していないその他の未知数を補うために、さらに微調整する必要がある場合があることに注意してください。

属性の有無にかかわらずタグをキャプチャするために使用する正規表現は次のとおりです。

'#<(' . implode( '|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s'
于 2012-06-23T01:04:49.970 に答える
1

シンプルな HTML DOM を使用しているとのことです (これは HTML を解析する正しい方法です)。タグとその内容を削除する必要がある場合は、次のようにします。

$rows = $html->find("span");

foreach ($rows as $row)
{
  $row->outertext = "";
}

$html->load($html->save());

最後の行が必要なのは、変更が行われた後に DOM が混乱するため、変更が永続的になるように DOM 全体を折りたたんでから再度解析する必要があるためです (IMO、Simple HTML DOM のバグ)。

Simple HTML DOM アプローチは、正規表現よりも安全で安定しています。

于 2012-06-27T15:25:31.150 に答える