2009-09-06 4 views
0

Je suis tombé sur un bug intéressant en PHP. Fondamentalement, j'ai une expression régulière vue ci-dessous qui fonctionne bien dans un script (Script A) mais ne fonctionne pas quand mis dans une classe et utilisé dans un script (Script B).Expression régulière fonctionne dans un script et pas dans un autre

J'ai testé ce script sur PHP 5.3 et 5.2.

Script A:
http://iamdb.googlecode.com/svn/trunk/testing.php

Script B:
classe regex est utilisé dans: http://iamdb.googlecode.com/svn/trunk/imdb/search/imdb_search_title.class.php
Script appelant: http://iamdb.googlecode.com/svn/trunk/examples/Search_Debug.php

Expression régulière:

"#<br> aka <em>\"([^\"]*)\"</em>(?: -?,? ([^ ]*) (?:<em>\(([^\)]*)\)</em>)*)*#i" 

Merci.

Comme demandé, voici quelques exemple de sortie Script B ...

Array 
(
    [0] => Array 
     (
     ) 

    [1] => Array 
     (
     ) 

    [2] => Array 
     (
     ) 

    [3] => Array 
     (
     ) 

    [INPUT] => <small>(TV series)</small> <br>aka <em>"Hammer Time"</em> - USA <em>(working title)</em> 
) 

Les touches numérotées sont de l'appel preg_match_all et la clé d'entrée est ajouté par la suite pour montrer la chaîne d'entrée.

+0

Que voulez-vous dire, ne fonctionne pas? Quelle est l'entrée et la sortie de l'appel au membre de la classe? – strager

+1

En note, c'est une mauvaise idée d'essayer d'analyser XML/HTML avec des expressions régulières. –

+0

Vous avez offert de nombreuses alternatives convaincantes. – Andrew

Répondre

2

En regardant le débogueur, le sujet des preg_replace_all s ne correspondent pas entre la classe et l'test.php cas.

De le cas de test:

<small>(TV series)</small> <br> aka <em>"Sledge Hammer: The Early Years"</em> - USA <em>(second season title)</em> 

Le sujet réelle lorsqu'il est appelé de la classe:

<small>(TV series)</small> <br>aka <em>"Hammer Time"</em> - USA <em>(working title)</em> 

Il n'y a pas d'espace entre le <br> et le aka. Prenez cet espace hors de l'expression rationnelle et cela fonctionne.

1

Il n'y a rien de mal avec l'expression rationnelle ou l'incorporer dans une classe. Vous vous convainquez que vos situations de test sont équivalentes quand elles ne le sont pas. Dans le cas immédiat, la chaîne que vous envoyez la version de classe,

<small>(TV series)</small> <br>aka <em>"Hammer Time"</em> - USA <em>(working title)</em> 

ne correspond pas par l'expression régulière parce que le regex exige exactement un espace entre le <br> et le aka. Cette révision de cela fonctionne:

const REGEX_AKA = "#<br>\s*aka <em>\"([^\"]*)\"</em>(?: (?:-?)(?:,?) ([^ ]*) (?:<em>\(([^\)]*)\)</em>)*)*#i"; 
0

Essayez-vous faire correspondre une page de résultats de recherches sur IMDB réelle, comme this one?Sur cette page, le "<br>" et la "aka" sont toujours séparés par une référence d'entité pour un espace insécable:

<br>&#160;aka <em> 

Je ne sais pas si c'est toujours de cette façon; vous voudrez peut-être permettre plusieurs types et représentations de whitepsace, comme ceci:

<br>(?:&(?:#(?:160|xA0)|nbsp);|\xA0|\s)*+aka 

à savoir zéro ou plus: une référence d'entité pour une NBSP (décimal, hexadécimal ou nom); réel NBSP; ou un caractère espace blanc standard.

+0

Oui, je décode les entités HTML avant de parcourir mes expressions régulières. – Andrew

Questions connexes