2012-10-19 4 views
1

Je souhaite obtenir des correspondances sur une page Web en fonction de l'expression régulière suivante: (. *) Je l'ai testé sur regexpal.com (un outil de test d'expression régulière en ligne) et cela fonctionne correctement. Cependant, quand je l'utilise en php, je ne trouve aucune correspondance. La déclaration que j'utilise en php estpreg_match_all ne fonctionne pas comme prévu

preg_match_all("/<a href=\"\/title\/.*\/\">(.*)<\/a>/", $content, $matches); 

J'ai vérifié le contenu $, c'est correct. Donc, y a-t-il quelque chose qui ne va pas dans ma déclaration? Merci!

+0

essayez (. *?) Au lieu de (. *) – Adam

+0

Bizarre. Pouvez-vous montrer l'exemple de HTML réel qui devrait être couvert par cette regex? – raina77ow

+0

N'utilisez pas d'expressions régulières pour analyser HTML. Utilisez le module PHP DOM. http://htmlparsing.com/php.html –

Répondre

4

S'il vous plaît, s'il vous plaît ... pour l'amour de Dieu, ne pas envelopper les expressions régulières qui traitent avec des URL ou du HTML dans /. Vous devez vous échapper un peu partout. C'est terrible. Regardez ici:

preg_match_all('~<a href="/title/[^">]+/">(.*?)</a>~si', $content, $matches); 
  1. cite unique. Plus besoin d'échapper les guillemets doubles. Pourquoi utiliseriez-vous des guillemets doubles lorsque vous ne disposez pas de "{$ variables}" extensibles?
  2. Enveloppez RegExp dans n'importe quel caractère non réservé. Pour les URL et HTML/est le pire choix car il vous traîne pour échapper à la redondance de l'enfer.
  3. Utilisez 'si' comme indicateurs en HTML car les étiquettes peuvent être multilignes et. +? ou .*? correspondre à plusieurs lignes par défaut. Et vous avez besoin d'insensibilité à la casse.
  4. Évitez d'utiliser. +? dans les attributs. Vous pouvez capturer des tags entiers. Ajoutez des caractères de rupture aussi. Voir mon modèle ci-dessus ... donc vous ne le faites pas trop si le code HTML est cassé.

Il existe d'autres façons d'améliorer cela, mais cela devrait le faire.

Espérons que ça aide.

+1

C'est tellement bon. Beaucoup de bons conseils regex, Les trois derniers sont réalisables en dehors de php. Cela devrait être la réponse acceptée, si cela fonctionne (ce que je soupçonne que c'est le cas). – FrankieTheKneeMan

0
preg_match_all("/<a href\=\"\/title\/.*\/\">(.*?)<\/a>/", $content, $matches); 

Je voudrais essayer:

preg_match_all('/<a href\=".title.*">(.*?)<\/a>/', $content, $matches); 

par souci de concision.

1

Vous devez faire votre modèle de regex paresseux (non gourmand) en ajoutant ? >>

preg_match_all("/<a href=\"\/title\/.*?\/\">(.*?)<\/a>/", $content, $matches); 
+0

Le '=' doit aussi être échappé, non? – Adam

+1

@Adam - Pas nécessaire d'échapper '=' –

+0

+1 bon à savoir. – Adam

Questions connexes