J'essaie d'écrire une fonction simple pour fermer les balises HTML manquantes en utilisant PHP preg_replace.Aide avec les expressions rationnelles PHP utilisant un aspect négatif derrière
Je pensais que ce serait relativement simple, mais pour une raison quelconque, il ne l'a pas été.
Ce que je veux essentiellement essayer de faire est proche d'une balise manquante dans la ligne suivante:
<tr>
<th class="ProfileIndent0">
<p>Global pharmaceuticals</p>
<td>197.2</td>
<td>94</td>
</tr>
L'approche que je prends est d'utiliser un regard négatif derrière pour trouver l'ouverture des balises td qui sont non précédé par th ouvert et correctement fermé les étiquettes.
Par exemple:
$text = preg_replace('!<th(\s\S*){0,1}?>(.*)((?<!<\/th>)[\s]*<td>)!U','<th$1>$2</th>',$text);
J'ai écrit les motifs d'expression régulière d'innombrables façons différentes sans succès. Le problème a été que je ne peux pas sembler correspondre seulement sur le td ouvert avec le/ième manquant qui le précède - mais plutôt il semble correspondre sur plusieurs des balises td ouvertes.
Voici le texte d'entrée complète:
<CO_TEXT text_type_id="6">
<TEXT_DATA><![CDATA[<table class="ProfileChart"> <tr> <th class="TableHead" colspan="21">2008 Sales</th> </tr>
<tr> <th class="ProfileIndent0"></th> <th class="ProfileHead">$ mil.</th> <th class="ProfileHead">% of total</th> </tr>
<tr> <th class="ProfileIndent0"> <p>Global pharmaceuticals</p> <td>197.2</td> <td>94</td> </tr>
<tr> <th class="ProfileIndent0">Impax pharmaceuticals</th> <td>12.9</td> <td>6</td> </tr>
<tr> <th class="ProfileTotal">Total</th> <td class="ProfileDataTotal">210.1</td> <td class="ProfileDataTotal">100</td> </tr> </table><h3>Selected Generic Products</h3><ul class="prodoplist"><li>Anagrelide hydrochloride (generic Agrylin, thrombocytosis)</li><li>Bupropion hydr ochloride (generic Wellbutrin SR, depression)</li><li>Colestipol hydrochloride (generic Colestid, high cholesterol)</li><li>Dantrolene sodium (generic Dantrium, spasticity)</li><li>Metformin Hcl (generic Glucophage XR, diabetes)</li><li>Nadolol/Bendroflumethiazide (generic Corzide, hypertension)</li
><li>Oxybutynin chloride (generic Ditropan XL, urinary incontinence, with Teva)</li><li>Oxycodone hydrochloride (generic OxyContin controlled release, pain)</li><li>Pilocarpine hydrochlorine (generic Salagen, dry mouth caused by radiation therapy)</li></ul>]]></TEXT_DATA> </CO_TEXT>
Y at-il quelque chose avec behinds regard négatif en PHP que je ne suis pas au courant, ou ai-je tout simplement pas frappé à droite modèle correspondant?
Toute aide serait grandement appréciée.
Merci, John
Salut! (désolé, ce n'est pas une réponse, juste une pensée, peut-être que cela vous aidera à penser qu'il pourrait y avoir d'autres façons de le faire.) En regardant votre regex, il n'y a qu'une seule chose qui me vient à l'esprit. bon outil "pour ce que vous essayez de faire ... Il est déjà difficile de lire une regex, et je n'imagine pas le désordre qu'il faudra pour être capable de gérer tout type de pseudo foiré -HTML on pourrait le nourrir ... –
Pascal, oui - je sais ce que vous dites. Après avoir cogné la tête contre le mur ces derniers jours, je pense qu'il y a une meilleure façon de régler le problème. En particulier, attraper le mauvais HTML à la source - plutôt que la fin de l'affichage. – John