2012-12-30 9 views
0

J'ai fait cette regex:ne correspondent pas si la chaîne contient un texte spécifique

(?<=span class="ope">)?[a-z0-9]+?\.(pl|com|net\.pl|tk|org|org\.pl|eu)|$(?=<\/span>)$

Il ne correspond aux chaînes comme: example.pl, example12.com, something.eu mais il correspondra aussi dontwantthis.com.

Ma question est de savoir comment ne pas correspondre à une chaîne dans le cas où il contient la chaîne dontwantthis?

+0

Dans quoi est écrit votre client? – hd1

+0

@ hd1 Oh désolé, c'est 'PHP 5.4'. – Scott

+0

** N'utilisez pas d'expressions régulières pour analyser HTML **. Vous ne pouvez pas analyser de manière fiable HTML avec des expressions régulières. Dès que le HTML change de vos attentes, votre code sera brisé. Voir http://htmlparsing.com/php.html pour des exemples de comment analyser correctement le HTML avec les modules PHP. –

Répondre

1

Il semble que vous extrayez le contenu des éléments span en utilisant une expression régulière. Maintenant, malgré all le reasons pourquoi this is not une telle bonne idée ...

... gardez l'expression que vous avez. Ensuite, si vous avez une correspondance, filtrez les entrées correspondantes qui doivent être rejetées.

var $match = extractContentFromHtml($html); // use regex here, return false if no match 
if ($match && validMatch($match)) { 
    // do something 
} 

validMatch(string) doit vérifier si la valeur existe dans une matrice, par exemple.

+0

Eh bien, j'ai compris, mais dans ce cas, je ne me soucie pas vraiment de la mise en forme [X] HTML, car seules les balises '' vont changer - je ne vois pas vraiment la raison de l'analyse de centaines de résultats avec une fonction supplémentaire, lorsque regex (pour autant que je sache) peut exclure certains résultats si le texte contient une chaîne spécifiée. Il y a déjà quelques conditions, pourquoi une autre simple peut-elle menacer? – Scott

+0

Je ne sais pas quelle est votre entrée brute pour extraire le contenu. Si ce n'est qu'une simple chaîne HTML 'span' (et pas un document HTML entier), c'est assez bon. Si c'est un gros morceau HTML, vous devez probablement l'analyser et extraire les nœuds de texte de la plage et les collecter à la place. Quoi qu'il en soit, AFAIK, regex sont destinés à faire correspondre des choses, pas le contraire, et ce ne sera pas seulement mentalement plus sûr de l'avoir fait en deux étapes, il sera plus clair et plus maintenable :) –

3

Vous suivez probablement votre regex avec une boucle pour parcourir les correspondances. Dans ce cas, il est probablement plus facile de vérifier la présence de la sous-chaîne dontwantthis et continue si elle est présente. Essayer de l'implémenter dans regex ne demande que des ennuis.

+0

Pourriez-vous expliquer plus sur le "problème" dans ce cas? J'apprends regex et juste curieux. – Scott

+0

Avez-vous vu la regex pour un email? [This] (http://www.regular-expressions.info/email.html) est le genre de chose qui naît quand quelqu'un essaie pédantiquement de tout faire en regex. –

Questions connexes