2010-08-26 5 views
0

J'ai essayé d'utiliser grubers latest url matching regex dans un projet PHP.Grubers nouvelle et améliorée URL reconnaissant regex

Pour le tester, j'ai jeté ensemble quelque chose de très simple:

$regex = "(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:"'.,<>?«»“”‘’]))"; 

$array = pret_match_all($regex, $theblockofurltext); 

print_r($array); 

Le premier problème était le "échapperait à une chaîne, selon laquelle j'Enveloppez la regex avec, donc je viens enlevai L'utilisation de ce. est personnel et je n'aurai jamais "n'importe où près d'une url de toute façon. Cela m'a laissé avec une nouvelle regex.

$regex = "(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'.,<>?«»“”‘’]))"; 

Gonflé à j'entrerais couru mon petit script et il m'a donné l'erreur suivante:

Warning: preg_split() [function.preg-split]: Unknown modifier '\' in D:\wwwroot\xxx\index.php on line 14 

Malheureusement ma classe REGEX à l'école n'a pas été appris à approcher les niveaux de cette regex exige , et je n'ai aucune idée par où commencer à corriger cela pour une utilisation avec PHP. Toute aide serait grandement appréciée. Sans doute, je suis sans doute faire quelque chose de stupide aussi, donc s'il vous plaît allez-y doucement sur moi :)

Jon

Répondre

1

Si vous utilisez PCRE, l'expression régulière doit être enfermé dans delimiters. Maintenant, parenthèse () peut également être des délimiteurs, c'est pourquoi le moteur pense, votre expression est seulement (?i) et interprète le prochain \ comme modificateur.

Vous pouvez utiliser ~ comme séparateur:

$regex = "~(?i)\b...]))~"; 

Mise à jour:

Je ne sais pas si PHP supporte la modification partielle d'une expression avec (?i). Donc, vous pouvez enlever cela et mettre le modificateur après le séparateur à la place (vous l'appliquez à toute expression de toute façon):

$regex = "~\b...]))~i"; 

+0

Il fait. La regex fonctionne parfaitement maintenant. Merci pour votre explication de pourquoi ça ne fonctionnait pas trop :) – JonB

+0

@JonB: Ouais je l'ai juste essayé aussi;) –

2

Ajouter # avant et après votre RE.

$regex = "#(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'.,<>?«»“”‘’]))#";