Question

J'ai envie d'améliorer mes compétences regex pour un certain temps maintenant et « Maîtrise des expressions régulières » a été recommandé à quelques reprises si je l'ai acheté et ont été le lire au cours de la journée écoulée.

J'ai créé l'expression régulière suivante:

^(?:<b>)?(?:^<i>)?<a href="/site\.php\?id=([0-9]*)">(.*?) \(([ a-z0-9]{2,10})\)</a>(?:^</i>)?(?:</b>)?$

Ce qui correspond aux deux premiers liens, mais ne tient pas compte des deux entouré par une balise <i>. Il extrait l'identifiant, le titre et le type.

<a href="/site.php?id=6321">site 1 title (type 1)</a>
<b><a href="/site.php?id=10254">site 2 title (type 2)</a></b>

<i><a href="/site.php?id=5479">site 3 title (type 3)</a></i>
<b><i><a href="/site.php?id=325">site 4 title (type 4)</a></i></b>

Bien que cela fonctionne, il semble assez longtemps pour quelque chose de si simple, pourrait-il être amélioré?

Était-ce utile?

La solution

Si votre screenscrappers d'écriture comme Whilliham mentionne à juste titre DOM pourrait juste être un analyseur approprié comme Regex depuis HTML est beaucoup plus clément alors regex.

Non raccourci de beaucoup, mais un peu l'expression rationnelle est plus tolérant

  • Suppression de début de la chaîne et à la fin de contrôles de chaîne, avez-vous vraiment besoin les?
  • lookbehind négatif pour vous assurer que <a> n'est pas par <i> précédée
  • utilisation de asertation simple, \ d au lieu de [0-9] nettoyant peu.
  • Vous avez eu taper 3 à 11 caractères je l'ai changé à 3 ou plus.
  • contrôles supprimés pour les balises de fin ils servent pas de sens contextuel pour votre screenscrapper (probablement).

(?<!<i>)<a href="/site.php\?id=(\d*)">(.*?) \(([ a-z\d]{2,})\)

Autres conseils

Court d'utiliser des classes de caractères (\ d pour 0-9 etc.) Je ne vois pas qui pourrait être beaucoup écourté l'expression régulière en question; mais ...

En marge, il peut être utile de mentionner que le HTML d'analyse syntaxique des expressions régulières est au mieux dangereux; lorsqu'ils traitent avec HTML (et dans une moindre mesure, XML), des outils DOM sont généralement mieux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top