2010-07-18 4 views
0

Hé les gars, je suis en train de faire correspondre "adresse" dans cette page -RegEx ne fonctionne pas avec anticipations!

http://www.bbb.org/norfolk/business-reviews/tax-return-preparation/liberty-tax-service-in-virginia-beach-va-48000604

La source d'une partie d'adresse a ce code HTML

<tr> 
    <td align="right" class="generalinfo_left">Address:</td> 
    <td class="generalinfo_right">1 S Main St Ste 1430<br /></td> 
</tr> 
<tr> 
    <td align="right" class="generalinfo_left"></td> 
    <td class="generalinfo_right">Dayton, OH 45402</td> 
</tr> 

Alors, j'ai essayé la RegEx suivante en PHP .

"%Address:</td>(.*?)(?!<br />)</td>%s" 

où "s" est le modificateur pour "." pour faire correspondre de nouvelles lignes aussi. Mais ça ne fonctionne pas. Il ne correspond pas à la partie "Dayton, OH 45402". Quelqu'un peut-il me dire pourquoi?

Répondre

0

Il est assez normal:.. Si vous regardez votre échantillon texte, vous verrez qu'entre Adresse et Dayton, OH 45402, vous avez <br />. (?!<br />) stipule expressément qu'il ne doit pas correspondre si <br /> se trouve.

vous devez utiliser l'analyseur pour HTML.

cela dit, en supposant que tous les vos fichiers sont e Xactly comme cet exemple, ce regex laid devrait fonctionner:

%(Address:)(.*?generalinfo_right">)(.*?)((<br />)|(</td>))(.*?generalinfo_right">)(.*?)((<br />)|(</td>))%s 

Groupes 1, 3 et 8 contiennent l'adresse.

Cependant, puisque vos documents ne sont probablement pas tous exactement comme cela, une meilleure solution serait d'analyser HTML avec un analyseur approprié.

+0

Merci ça marche! Et certainement, je vais essayer les parseurs pour analyser HTML. – Shubham

+1

Il est très tentant de downvote pour cet horrible abus de parenthèses. Votre expression n'a besoin que de quatre groupes - deux non capturants - et non des * onze * captures que vous utilisez! –

+0

@Peter: LOL. Détendez-vous, ces parenthèses étaient en vente, elles ne coûtent pas beaucoup. Comme je l'ai dit, c'est une regex moche, mais ça marche et comme je suggère d'utiliser un analyseur, je n'ai pas pris le temps de le faire paraître mieux que maintenant, j'ai tapé la première chose qui venait à l'esprit. – Sylverdrag

1

Veuillez ne pas essayer d'analyser HTML avec des expressions régulières, il invokes the wrath of Zalgo. Essayez d'utiliser the DOM et xpath pour cibler les éléments et attributs spécifiques que vous tentez d'extraire.

(je vous donner un exemple de XPath, mais il est toujours sur ma liste à apprendre ... :))

0

Le .*? va tout le chemin jusqu'à la fin de la <br />. Ensuite, le texte suivant est "</td>", donc le lookahead échoue et la correspondance réussit, avec la capture étant, "<td class="generalinfo_right">1 S Main St Ste 1430<br />". En d'autres termes, le lookahead n'empêche pas le match car c'est trop tard.

Il y a plusieurs façons d'écrire correctement (par exemple, vous pouvez explicitement ajouter le <tr> et <td class="generalinfo_right"> Cependant, Charles est juste que vous devez utiliser un véritable analyseur

Questions connexes