2009-06-29 5 views
0

Je ne sais pas rubis. J'essaie d'utiliser l'expression rationnelle suivante qui a été générée par ruby ​​(à savoir par http://www.a-k-r.org/abnf/ s'exécutant sur la grammaire donnée rfc1738) en php. Il échoue à correspondre en php, mais il correspond avec succès à ruby. Est-ce que quelqu'un voit quelles différences entre la manipulation des expressions rationnelles par php et ruby ​​pourrait expliquer cette différence?Une regex que je travaille dans Ruby ne fonctionne pas en PHP; Quelle pourrait être la cause?

 
http:\/\/(?:(?:(?:(?:[0-9a-z]|[0-9a-z](?:[\x2d0-9a-z]?)*[0-9a-z])\x2e)?)*(?:[a-z]|[a-z](?:[\x2d0-9a-z]?)*[0-9a-z])|\d+\x2e\d+\x2e\d+\x2e\d+)(?::\d+)?(?:\/(?:(?:[!\x24'-\x2e0-9_a-z]|%[0-9a-f][0-9a-f]|[&:;[email protected]])?)*(?:(?:\/(?:(?:[!\x24'-\x2e0-9_a-z]|%[0-9a-f][0-9a-f]|[&:;[email protected]])?)*)?)*(?:\x3f(?:(?:[!\x24'-\x2e0-9_a-z]|%[0-9a-f][0-9a-f]|[&:;[email protected]])?)*)?)?/i 

Puisque vous tous amour regexes tellement, que diriez-vous d'une solution de rechange. Étant donné l'ABNF dans un rfc, je veux un moyen (en php) de vérifier si une chaîne arbitraire est dans la grammaire.

APG ne parvient pas à compiler sur un système 64 bits,

VTC est pas F ree,

et j'ai pas trouvé d'autres outils. Je préférerais également ne pas utiliser une regex, mais c'est le plus proche que je suis arrivé au succès.

+1

Vous aurez envie de poster un exemple de code montrant comment vous invoquer le reg-ex dans Ruby vs comment vous l'invoquez en PHP. La plupart des problèmes reg-ex PHP se résument à l'échappement de chaînes. c'est-à-dire en PHP, vous passez une chaîne aux fonctions pcre. La chaîne a échappé avant d'être envoyée au moteur reg-ex, ce qui signifie que le reg-ex que vous pensez passer n'est souvent pas le vrai. (Il y a aussi le problème de PCRE (preg_) par rapport à (ereg_). Vous voulez probablement preg. –

+5

Certaines personnes, lorsqu'ils sont confrontés à un problème, pense « Je sais, je vais utiliser des expressions régulières. » Maintenant, ils ont deux problèmes . – Chuck

+1

la seule chose pire qu'un humain à générer des expressions rationnelles, est un ordinateur. – karim79

Répondre

1

Il serait agréable de voir un échantillon du code que vous essayez d'utiliser en PHP, mais essayez ce qui suit (souvenez-vous de changer $ _SERVER [ « HTTP_REFERER »] à votre variable d'entrée):

if (preg_match('#http://(?:(?:(?:(?:[0-9a-z]|[0-9a-z](?:[\\x2d0-9a-z]?)*[0-9a-z])\\x2e)?)*(?:[a-z]|[a-z](?:[\\x2d0-9a-z]?)*[0-9a-z])|\\d+\\x2e\\d+\\x2e\\d+\\x2e\\d+)(?::\\d+)?(?:/(?:(?:[!\\x24\'-\\x2e0-9_a-z]|%[0-9a-f][0-9a-f]|[&:;[email protected]])?)*(?:(?:/(?:(?:[!\\x24\'-\\x2e0-9_a-z]|%[0-9a-f][0-9a-f]|[&:;[email protected]])?)*)?)*(?:\\x3f(?:(?:[!\\x24\'-\\x2e0-9_a-z]|%[0-9a-f][0-9a-f]|[&:;[email protected]])?)*)?)?#i', $_SERVER["HTTP_REFERER"], $l_Results)) { 
    $result = $l_Results[1]; 
} else { 
    $result = ""; 
} 
+0

Malheureusement, cela ne produit aucun résultat avec $ _SERVER ["HTTP_REFERER"] égal à "http://us2.php.net/". –

+1

Je ne m'y attendrais pas - votre regex nécessite http: // au début. Peut-être pourriez-vous expliquer mieux ce que vous essayez d'accomplir. – Templar

+0

test d'autolinking dans les commentaires; J'ai le http écrit cette fois: http://us2.php.net/ –

Questions connexes