2009-07-23 7 views
6

Mi stavo chiedendo se qualcuno sapesse di una funzione per rimuovere tutte le classi da una stringa in php .. Fondamentalmente voglio solostriscia di tutte le classi di tag p

<p> 

tag piuttosto che

<p class="..."> 

Se questo ha un senso :)

risposta

8

Un'espressione regolare abbastanza ingenuo probabilmente funzionerà per voi

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

Dico ingenuo perché fallirebbe se il testo del tuo corpo contenesse class = "qualcosa" per qualche ragione !. Potrebbe essere reso un po 'più robusto cercando class = "" all'interno dei tag angolati tra parentesi se necessario.

+0

Grazie mille, funziona come un fascino :) – SoulieBaby

+0

Il codice funziona con lettere maiuscole/minuscole, singole/doppie/senza virgolette, spazi tra parentesi, spazi prima e dopo la lezione? –

+0

No - solo i casi indicati dall'OP. Tutto il resto è lasciato come esercizio per il lettore :) –

1

Vorrei fare qualcosa di simile su jQuery. Inserire questo nell'intestazione pagina:

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

});

+0

Non PHP, ma una soluzione migliore – Draemon

+2

Non so come sarebbe meglio senza sapere perché l'OP voleva farlo. –

+0

Non meglio, solo un altro modo per farlo :) – Teknotica

2

Forse è un po 'eccessivo per il vostro bisogno, ma, per analizzare/validazione/dati HTML puliti, lo strumento migliore che conosco è HTML Purifier

Esso consente di definire quali tag e gli attributi, sono OK; e/o quali non lo sono; e fornisce output HTML valido/pulito (X).

(utilizzando espressioni regolari per "analizzare" HTML sembra OK all'inizio ... E poi, quando si desidera aggiungere cose specifiche, diventa in genere un inferno per capire/mantenere)

+0

Correggetemi se ho torto, ma gli analizzatori lessicali veri parser XML non usano l'XML separatamente con regex? Penso che il vero problema è che quando le persone provano a fare i parser regex, cercano di saltare al centro o alla fine di una stringa invece di iniziare all'inizio della stringa come fa un vero parser. – joebert

+1

Non credo che lo facciano - non sono sicuro, ma ... sembra strano. Comunque, anche se lo fanno, probabilmente sono più testati (perché sono ampiamente usati) rispetto alla regex che scriverai per il tuo progetto. –

2

Si carica il codice HTML in una classe DOMDocument, caricarlo in simpleXML. Quindi esegui una query XPath per tutti gli elementi p e quindi esegui un ciclo su di essi. Su ogni ciclo, si rinomina l'attributo di classe in qualcosa come "killmeplease".

Al termine, reoutput del file XML semplice come XML (che, a proposito, può modificare l'HTML, ma in genere solo per il meglio), e si avrà una stringa HTML in cui ogni p ha una classe di "killmeplease" . Usa str_replace per rimuoverli effettivamente.

Esempio:

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

Oppure, se si vuole rendere il codice più semplice, ma groviglio con preg_replace, si potrebbe andare con:

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

La parte difficile con le espressioni regolari è che tendono essere avido e provare a disattivarlo può causare problemi se il tag p dell'elemento ha un'interruzione di riga. Ma dai uno a entrambi.

1

HTML Purifier

HTML può essere molto difficile da regex a causa delle centinaia di modi diversi di codice può essere scritto o formattati.

HTML purifier è una libreria open source per la pulizia dell'HTML. Consiglierei il suo utilizzo in questo caso.

Nella documentazione di configurazione del purificatore HTML, è possibile specificare classi e attributi che dovrebbero essere consentiti e che cosa dovrebbe fare il depuratore se li trova.

http://htmlpurifier.org/docs/

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

Se vi viene messo alla prova contro HTML di Microsoft Office-esportato avrete bisogno di più di classe di rimozione, ma HTML Tidy ha una config flag solo per Microsoft Office!

Altrimenti, questo dovrebbe essere più sicuro di alcune altre risposte dato che sono un po 'avidi e non si sa quale tipo di incapsulamento verrà utilizzato (' o ").

Nota: Il modello è in realtà /\sclass=['|"][^'"]+['|"]/, ma, come ci sono entrambe le virgolette (") apostrofi ('), ho dovuto scappare tutte le occorrenze di uno (\') per incapsulare il modello.