2009-07-23 7 views
6

Ich habe mich nur gefragt, ob jemand eine Funktion kannte alle Klassen aus einer Zeichenfolge in PHP entfernen .. Grundsätzlich möchte ich nurStreifen alle Klassen von p-Tags

<p> 

Tags statt

<p class="..."> 

Wenn das macht Sinn :)

Antwort

8

Eine ziemlich naive Regex wahrscheinlich für Sie arbeiten

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

Ich sage naiv, weil es fehlschlagen würde, wenn Ihr Body Text aus irgendeinem Grund class = "etwas" enthält !. Es könnte ein wenig robuster gemacht werden, indem man nach innen innerhalb angled Bracket Tags sucht, wenn es sein muss.

+0

Vielen Dank, funktioniert wie ein Charme :) – SoulieBaby

+0

Funktioniert der Code mit Groß/Kleinschreibung, Einzel-/Doppel/keine Anführungszeichen, Leerzeichen dazwischen, Leerzeichen vor und nach der Klasse? –

+0

Nein - nur die vom OP angezeigten Fälle. Alles andere bleibt als Übung für den Leser übrig. –

1

Ich würde so etwas auf jQuery tun. Legen Sie diese in Ihren Seitenkopf:

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

});

+0

Nicht PHP, aber eine bessere Lösung – Draemon

+2

Nicht sicher, wie das besser sein könnte, ohne zu wissen, warum das OP dies tun wollte. –

+0

Nicht besser, nur andere Möglichkeit, es zu tun :) – Teknotica

2

Vielleicht ein bisschen übertrieben für Ihre Notwendigkeit ist es aber, zu analysieren/Validierung/clean HTML-Daten, das beste Werkzeug, das ich weiß, ist, HTML Purifier

Es Ihnen, welche Tags definieren kann, und welche Attribute, ist in Ordnung; und/oder welche nicht sind; und es gibt gültiges/sauberes (X) HTML als Ausgabe.

(reguläre Ausdrücke verwenden zu „analysieren“ HTML scheint am Anfang OK ... Und dann, wenn Sie bestimmte Sachen hinzufügen möchten, wird es in der Regel die Hölle zu verstehen/halten)

+0

Korrigieren Sie mich, wenn ich falsch liege, aber nicht die lexikalischen Analysatoren wahre XML-Parser verwenden Sie die XML-abgesehen mit Regex sowieso? Ich denke, das eigentliche Problem ist, dass wenn Leute versuchen, Regex-Parser selbst zu tun, sie versuchen, an die Mitte oder Ende einer Zeichenfolge zu springen, anstatt am Anfang der Zeichenfolge wie ein echter Parser beginnt. – joebert

+1

Ich glaube nicht, dass sie es tun - nicht sicher, aber ... scheint seltsam. Wie auch immer, auch wenn sie es tun, werden sie wahrscheinlich mehr getestet (weil sie weit verbreitet sind) als die Regex, die Sie für Ihr eigenes Projekt schreiben werden. –

2

Sie laden die HTML In eine DOMDocument-Klasse laden Sie diese in simpleXML. Dann führen Sie eine XPath-Abfrage für alle p-Elemente durch und durchlaufen sie dann. In jeder Schleife benennen Sie das Klassenattribut in "killmeplease" um.

Wenn Sie das getan haben, geben Sie simpleXML als XML zurück (was übrigens die HTML ändern kann, aber normalerweise nur zum besseren), und Sie werden eine HTML-Zeichenfolge haben, wobei jedes p eine Klasse von "killmeplease" hat . Verwenden Sie str_replace, um sie tatsächlich zu entfernen.

Beispiel:

$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); 

Oder, wenn Sie den Code einfach, aber Gewirr mit preg_replace machen möchten, können Sie gehen mit:

$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); 

Der schwierige Teil mit regulären Ausdrücken ist sie neigen dazu, gierig zu sein und zu versuchen, das auszuschalten, kann zu Problemen führen, wenn dein p-Element-Tag einen Zeilenumbruch enthält. Aber geben Sie beiden einen Schuss.

1

HTML Purifier

HTML kann sehr schwierig sein, weil der Hunderte von verschiedenen Möglichkeiten, um regex Code kann geschrieben oder formatiert werden.

Die HTML purifier ist eine ausgereifte Open-Source-Bibliothek zum Aufräumen von HTML. Ich würde seine Verwendung in diesem Fall empfehlen.

In der Konfigurationsdokumentation zu HTML Purifier können Sie Klassen und Attribute angeben, die erlaubt sein sollten und was der Purifier tun sollte, wenn er sie findet.

http://htmlpurifier.org/docs/

2
$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";  
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html); 

Wenn Sie zum Test gegen Microsoft Office-exportierte HTML gesetzt werden Sie mehr als Klasse-Entfernung benötigen, aber HTML Tidy hat eine config flag nur für Microsoft Office!

Sonst sollte dies sicherer sein als einige andere Antworten gegeben, sie sind ein wenig gierig und Sie wissen nicht, welche Art von Verkapselung verwendet wird (' oder ").

Hinweis: Das Muster ist eigentlich /\sclass=['|"][^'"]+['|"]/ aber, da es beiden Anführungszeichen (") Apostrophe ('), hatte ich alle Vorkommen einer (\') zu entkommen, das Muster zu verkapseln.