8
votes

Soutenez toutes les classes des balises P

Je me demandais simplement si quelqu'un connaissait une fonction pour supprimer toutes les classes d'une chaîne de php

si cela a du sens :)


0 commentaires

6 Réponses :


11
votes

Une regex assez naïve fonctionnera probablement pour vous

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


3 commentaires

Le code fonctionne-t-il avec les majuscules / minuscules, simple / double / pas de guillemets, espaces entre les espaces avant et après la classe?


Non - seuls les cas indiqués par l'OP. Tout ce qui est laissé comme un exercice pour le lecteur :)


N'utilisez pas Regex pour HTML. Utilisez plutôt PHP Simple HTML DOM Parser Bibliothèque.



1
votes

Je ferais quelque chose comme ça sur JQuery. Placez ceci dans votre page d'en-tête de page: xxx

});


3 commentaires

Pas php, mais une meilleure solution


Je ne sais pas comment cela pourrait être mieux sans savoir pourquoi l'OP voulait faire cela.


Pas mieux, juste une autre façon de le faire :)



3
votes

Peut-être que c'est un peu excentrée pour votre besoin, mais pour analyser / valider / nettoyer les données HTML, le meilleur outil que je connais est Purificateur HTML

Cela vous permet de définir les balises quelles étiquettes et quels attributs sont ok; et / ou lesquels ne sont pas; et il donne valide / propre (x) HTML en tant que sortie.

(à l'aide de Regexes to "Pays" HTML semble ok au début ... et ensuite, lorsque vous souhaitez ajouter des choses spécifiques, cela devient généralement l'enfer pour comprendre / entretenir)


2 commentaires

Corrigez-moi si je me trompe, mais les analyseurs lexicaux que les analyseurs Lexical XML utilisent-ils le XML séparément avec Regex? Je pense que le vrai problème est que lorsque les gens essaient de faire des analgésiques surgènes eux-mêmes, ils essaient de passer au milieu ou à la fin d'une chaîne au lieu de commencer au début de la chaîne comme un vrai parseur.


Je ne pense pas qu'ils ne font pas - pas sûr de ça, mais ... semble étrange. Quoi qu'il en soit, même s'ils le font, ils sont probablement plus testés (car ils sont largement utilisés) que la regex que vous vous écrirez pour votre propre projet.



2
votes

Vous chargez le HTML dans une classe DOMDocument, chargez cela dans SimplexML. Ensuite, vous faites une requête XPath pour tous les éléments P puis la boucle. Sur chaque boucle, vous renommez l'attribut de classe à quelque chose comme "KillmePlease".

Quand cela est fait, réacheminez le SimplexML en tant que XML (qui, au fait, peut modifier le code HTML, mais généralement uniquement pour le mieux), et vous aurez une chaîne HTML où chaque P a une classe de "KillmePlease". Utilisez str_replace pour les supprimer réellement. P>

Exemple: P>

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


0 commentaires

2
votes

Purificateur HTML

html peut être très délicat pour regex à cause des centaines de code de différentes manières, peut être écrit ou formaté.

the purificateur HTML est une bibliothèque open source mature pour nettoyer HTML. Je conseillerais son utilisation dans ce cas.

Dans la documentation de configuration du purificateur HTML, vous pouvez spécifier des classes et des attributs qui doivent être autorisés et ce que le purificateur doit faire s'il les trouve.

http://htmlpurifier.org/docs/


0 commentaires

2
votes
$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";    
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html);
If you are being put to the test against Microsoft Office-exported HTML you'll need more than class-removal but HTML Tidy has a config flag just for Microsoft Office!Otherwise, this should be safer than some other answers given they are a little greedy and you don't know what sort of encapsulation will be used (' or ").Note: The pattern is actually /\sclass=['|"][^'"]+['|"]/ but, as there are both inverted commas (") apostrophes ('), I had to escape all occurrences of one  (\') to encapsulate the pattern.

0 commentaires