2009-07-09 8 views
0

Alors oui, je suce avec des expressions régulières. Doit être fait avec php. Merci. Je dois être en mesure de sortir "xx" (sera toujours 2 caractères alphabétiques minuscules) et "a12" (peut être n'importe quoi, mais sera toujours .php).Aide pour obtenir des valeurs via regex (php)

String: 
http://foo.bar.com/some_directory/xx/a12.php?whatever=youwant 
+0

Juste une note - quelques-unes des réponses jusqu'ici semblent avoir accidentellement oublié d'échapper à une barre oblique ou deux dans leur expression régulière, alors quelle que soit la réponse vous convient, assurez-vous de vérifier que PHP ou vous jetez probablement poubelle sur les modificateurs inconnus et autres. À votre santé! –

Répondre

1

Depuis qu'il cherche une solution PHP et pas seulement PCRE, je pense que quelque chose comme ça pourrait être un peu plus complet:

$src = 'http://foo.bar.com/some_directory/xx/a12.php?whatever=youwant'; 
preg_match('/([a-z]{2})\/([^\/]+)\.php/', $src, $matches); 
/* grab "xx" */ 
$first = $matches[1]; 
/* grab "a12" */ 
$second = $matches[2]; 
+0

J'ai choisi celui-ci parce que c'était le seul qui ne s'est pas trompé lors de l'exécution. J'ai également trouvé utile d'ajouter un_répertoire \/pour m'assurer que j'avais une correspondance valide. –

+0

Bon appel. J'ai eu une vision de tunnel sur la pièce xx/a12.php et je n'ai même pas pensé au reste de la chaîne - que vous pourriez bien sûr construire dans l'expression régulière ou faire une vérification avant la main, comme dans if (strpos ($ src, 'http://foo.bar.com/some_directory/') === 0) { // trucs regex } else { // trucs d'erreur } –

0
"([a-z]{2})\/([^/]+)\.php" 

assurez-vous capturez matchs. xx sera dans le groupe 1, a12 sera dans le groupe 2

+0

Vous voulez dire ([a-z] {2}) \/([^ /] *) \. Php –

+1

De rien. –

+0

Je pense qu'il est tout à fait rationnel d'utiliser + au lieu de * à la fin - c'est une vérification supplémentaire sur les données fausses, car cela garantit que le nom de fichier n'est pas simplement une extension. L'un ou l'autre fonctionnera, mais il n'y a aucune raison de ne pas avoir la validation supplémentaire. –

0

/([a-z] {2})/([a-zA-Z0-9 _-] +)

$string = http://foo.bar.com/some_directory/xx/a12.php?whatever=youwant 


$matches; 
preg_match("/([a-z]{2})/([a-zA-Z0-9_\-]+)", $string, $matches); 

$part_1 = $matches[1]; //xx 
$part_2 = $matches[2]; //a12 

Bonne chance!