2012-07-24 3 views
3

Je travaille sur un site wordpress qui utilise un widget plugin/sidebar. La question que je vis est que le widget génère du HTML non valide, un exemple est ci-dessous ...Utilisation de preg_replace pour nettoyer la sortie du widget HTML

<p> 
<div>I am item 1</div> 
<div>I am item 2</div> 
<div>I am item 3</div> 
<div>I am item 4</div> 
<p></p> 

De ma compréhension, il y a deux choses qui clochent ce code, le premier étant qu'il utilise divs (élément de niveau bloc) à l'intérieur d'un paragraphe. La seconde étant qu'il y a une balise P supplémentaire qui n'est pas fermée à la fin.

J'ai parlé aux développeurs de widgets et, même si c'est un plugin cher et payé, ne sont pas pressés de résoudre le problème.

Je vais essayer d'utiliser preg_replace pour nettoyer le code, je me demandais si quelqu'un avait des exemples ou des tutoriels pour faire cela et cibler seulement le code dans le conteneur de widget?

+0

Une astuce rapide: Il y a ce site où vous pouvez expérimenter sans cesse: http://gskinner.com/RegExr/ – xdbas

Répondre

3

Tout d'abord, quand je vois vos données (liste des articles), je pense que <ul> <li> serait encore mieux:

<ul> 
<li>I am item 1</li> 
<li>I am item 2</li> 
<li>I am item 3</li> 
<li>I am item 4</li> 
</ul> 

Pour votre preg_replace son même encore mieux si vous utilisez simplement un

str_replace (moins exepensive)
str_replace(array("<div>","</div>","<p>","</p>"), array("<li>","</li>","<ul>","</ul>"),$yourHtml) 

Ensuite, vous supprimez le vide <p></p> (maintenant <ul></ul>) par str_replace("<ul></ul>", "",$yourHtml)

Mais la solution encore meilleure serait d'éditer le plugin et de définir une sortie différente!


Après bien, une autre solution « mieux » serait d'obtenir tous les éléments d'un tableau avec preg_match_all.

Exemple:

$html="<p> 
<div>my item 1</div> 
<div>my item 2</div> 
<div>my item 3</div> 
<p></p>"; 

preg_match_all("#<div>(.*)</div>#",$html,$matchs); 

var_dump($matchs[1]); 
//var_dump output : array(3) { [0]=> string(9) "my item 1" [1]=> string(9) "my item 2" [2]=> string(9) "my item 3" } 

Si vous n'avez pas <div> dans <div> (je veux dire: <div> my <div>item 1</div></div>) ce code fonctionnerait très bien.

De cette façon, vous avez toutes vos données dans un tableau et elles sont plus faciles à manipuler. Je ne sais pas votre diplôme php, mais juste exécuter une boucle foreach

foreach($matchs[1] as $v){ 
     //$v is one item 
    } 
+0

Le problème que j'ai est que le plugin envoie juste des options à une API qui génère le code HTML et le redirige vers le plugin. Ce qui signifie que je n'ai aucun contrôle sur le code HTML qu'il génère. Je vais essayer de mettre en œuvre votre solution et voir comment ça se passe, merci pour votre contribution – fightstarr20

+0

Si l'API ne change pas sa sortie tous les mois cette "solution" sera bien mais ce n'est pas une solution lourde. Si vous voulez plus regarder ma réponse: j'ai édité et ajouté une autre solution. – troc

Questions connexes