8

誰かがphpの文字列からすべてのクラスを削除する関数を知っているかどうか疑問に思っていました。基本的に私は欲しいだけです

<p> 

タグではなくタグ

<p class="...">

それが理にかなっているなら:)

4

6 に答える 6

11

かなりナイーブな正規表現はおそらくあなたのために働くでしょう

$html=preg_replace('/class=".*?"/', '', $html);

なんらかの理由で本文にclass="something"が含まれていると失敗するので、ナイーブと言います。必要に応じて、角度の付いた括弧で囲まれたタグ内のclass = ""を探すことで、もう少し堅牢にすることができます。

于 2009-07-23T10:38:05.557 に答える
3

多分それはあなたの必要性のために少しやり過ぎです、しかし、HTMLデータを解析/検証/クリーンアップするために、私が知っている最高のツールはHTMLPurifierです

これにより、どのタグとどの属性がOKであるかを定義できます。および/またはそうでないもの; そしてそれは出力として有効/クリーンな(X)HTMLを提供します。

(正規表現を使用してHTMLを「解析」することは、最初は問題ないようです...そして、特定のものを追加したい場合、一般的に理解/維持するのは地獄になります)

于 2009-07-23T10:42:09.293 に答える
2

HTMLをDOMDocumentクラスにロードし、それをsimpleXMLにロードします。次に、すべてのp要素に対してXPathクエリを実行し、それらをループします。各ループで、クラス属性の名前を「killmeplease」のような名前に変更します。

それが完了したら、simpleXMLをXMLとして再出力します(ちなみに、これはHTMLを変更する可能性がありますが、通常はより良い方法です)。各pが「killmeplease」のクラスを持つHTML文字列が作成されます。str_replaceを使用して、実際にそれらを削除します。

例:

$html_file = "somehtmlfile.html";

$dom = new DOMDocument();
$dom->loadHTMLFile($html_file);

$xml = simplexml_import_dom($dom);

$paragraphs = $xml->xpath("//p");

foreach($paragraphs as $paragraph) {
     $paragraph['class'] = "killmeplease";
 }

 $new_html = $xml->asXML();

 $better_html = str_replace('class="killmeplease"', "", $new_html);

または、コードをより単純にしたいが、preg_replaceと絡み合いたい場合は、次のようにすることができます。

$html_file = "somehtmlfile.html";
$html_string = file_get_contents($html_file);

$bad_p_class = "/(<p ).*(class=.*)(\s.*>)/";

$better_html = preg_replace($bad_p_class, '$1 $3', $html_string);

正規表現のトリッキーな部分は、貪欲になる傾向があり、それをオフにしようとすると、p要素タグに改行が含まれている場合に問題が発生する可能性があることです。しかし、それらのいずれかを試してみてください。

于 2009-07-23T11:09:37.070 に答える
2

HTMLピュリファイア

HTMLは、コードを記述またはフォーマットするための何百もの異なる方法があるため、正規表現を行うのが非常に難しい場合があります。

HTMLピューリファイヤーは、 HTMLをクリーンアップするための成熟したオープンソースライブラリです。この場合の使用法をお勧めします。

HTML Purifierの構成ドキュメントでは、許可する必要のあるクラスと属性、およびそれらが見つかった場合にPurifierが実行する処理を指定できます。

http://htmlpurifier.org/docs/

于 2009-07-23T11:13:49.603 に答える
2
$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";    
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html);

Microsoft OfficeでエクスポートされたHTMLに対してテストを行う場合は、クラスの削除以上のものが必要になりますが、 HTMLTidyにはMicrosoftOffice専用の構成フラグがあります。

'そうでなければ、これは他のいくつかの回答よりも安全であるはずです。それらは少し貪欲であり、どの種類のカプセル化が使用されるか(または)がわからないためです"

注:パターンは実際に/\sclass=['|"][^'"]+['|"]/はありますが、両方とも逆コンマ(")アポストロフィ( )があるため、パターンをカプセル化するため'に1つの()のすべての出現をエスケープする必要がありました。\'

于 2012-10-11T15:04:52.097 に答える
1

私はjQueryでこのようなことをします。これをページヘッダーに配置します。

$(document).ready(function(){
$(p).each(function(){
     $(this).removeAttr("class");
     //or  $(this).removeclass("className");
})

});

于 2009-07-23T10:42:01.943 に答える