2010-11-11 9 views
3

Je veux modifier <img src=""> attributs dans HTML pas trop malformé (articles WordPress). Je sais que je peux prendre le moyen simple et utiliser des expressions rationnelles, mais j'ai peur people in blue furry suits will come haunt me in my sleep. Si j'utilise l'analyseur DOM pour lire le code HTML et modifier les balises <img>, je crains de ne pas pouvoir reconstruire le message exactement tel qu'il était (avec seulement ma modification), car l'analyseur DOM le fera probablement aussi beaucoup de nettoyage et peut-être supprimer les données essentielles. Un analyseur SAX ne peut probablement pas gérer le XML non valide, donc cela ne fonctionnera pas non plus.Garder les offsets de fichiers lors de l'analyse du HTML avec le DOM?

Donc, y a-t-il un moyen, où je peux utiliser un parseur DOM, mais qui sait où chaque élément a commencé, donc je peux faire des remplacements de chaînes ou quelque chose de similaire à partir de là? Je sais que certains noeuds de l'arborescence DOM n'existeront pas dans le document source (<b>Some <i>bizarre</b> formatting</i> le déclenchera probablement), mais cela signifie-t-il que c'est toujours impossible? Je vois qu'il y a un DOMNode::getLineNo() function ajouté en PHP 5.3, mais j'utilise 5.2.x.

Répondre

0

Si le DOM de PHP écrira des résultats "trop ​​propres", vous pouvez essayer la chaîne SimpleHTMLDOM si elle est plus indulgente. Cependant, avec un formatage aussi bizarre que vous montrez, je ne ferais jamais entièrement confiance à l'analyseur pour le faire correctement. Mais essayez-le, peut-être qu'il saute de telles choses. La classe DOMNode de la bibliothèque DOM a une méthode getLineNo(). Je ne vois pas tout à fait comment cela fonctionne, vu qu'il ne fournit pas de décalage pour aller avec. Je ne sais pas si cela aidera votre cas d'utilisation.

+0

Mon exemple de formatage était théorique, pourquoi cela ne peut pas fonctionner pour tous les nœuds DOM. Je crois que l'éditeur WordPress nettoie, donc je n'aurai pas à gérer un tel cas. Et la fonction 'DOMNode :: getLineNo()' pourrait être utile pour réduire la portée de la chaîne de remplacement finale, mais puisque je suis sur PHP 5.2 je ne peux pas l'utiliser. –

+0

@Jan alors DOM ou SimpleHTML pourrait travailler pour vous! –