2009-10-20 8 views
4

voici une regex j'ai obtenu de: un blog que je ne peux pas lier parce que je suis nouveau ... juste google amazon courte URL et cliquez sur le blog de noah coadamazon courte url regex ... pourquoi je ne peux pas obtenir ce travail

comme vous pouvez le voir sur cette page ... il est supposé extraire l'identifiant de produit unique de n'importe quelle URL d'amazon afin que vous puissiez le raccourcir ... ou l'utiliser pour extraire des informations d'amazon apis .

est ici l'exemple de code que je suis en train d'utiliser pour faire fonctionner:

<?php 
$example_url = 'http://www.amazon.com/dp/1430219483/?tag=codinghorror-20';  

$reg = '(?:http://(?:www\.){0,1}amazon\.com(?:/.*){0,1}(?:/dp/|/gp/product/))(.*?)(?:/.*|$)'; 

echo 'test<br/>'; 

echo preg_match($reg,$example_url); 
?> 

et voici ma sortie:

test 

Warning: preg_match() [function.preg-match]: Unknown modifier '(' in /Users/apple/Sites/amazon/asin_extract.php on line 14 

merci beaucoup! c'est la première fois que je publie sur ce site où j'ai déjà trouvé d'innombrables réponses

de seconde main ... reprenez quelques-uns de mes remerciements pour ce douloureux processus de soumission pour la première fois ... j'ai dû couper cette question depuis qu'elle pense que mes motifs regex sont des urls

+0

Vous pouvez remplacer '{0,1}' par ''. – Gumbo

Répondre

12

Votre regex a probablement besoin de délimiteurs: un caractère qui sera présent au début et à la fin de celui-ci.
This comment sur le manuel PHP est intéressé à ce sujet :-)

« / » est souvent utilisé; mais certaines personnes préfèrent '#' - le second étant agréable pour les URL

Alors:

$reg = '#(?:http://(?:www\.){0,1}amazon\.com(?:/.*){0,1}(?:/dp/|/gp/product/))(.*?)(?:/.*|$)#'; 

Et, avec le code complet, un peu modifié pour capturer les résultats:

$example_url = 'http://www.amazon.com/Professional-Visual-Studio-System-Programmer/dp/0764584367/ref=sr_1_1/104-4732806-7470339?ie=UTF8&s=books&qid=1179873697&sr=8-1'; 
$reg = '#(?:http://(?:www\.){0,1}amazon\.com(?:/.*){0,1}(?:/dp/|/gp/product/))(.*?)(?:/.*|$)#'; 
echo 'test<br/>'; 

$matches = array(); 
echo preg_match($reg,$example_url, $matches); 

var_dump($matches); 

la sortie que vous obtenez de l'var_dump est:

array 
    0 => string 'http://www.amazon.com/Professional-Visual-Studio-System-Programmer/dp/0764584367/ref=sr_1_1/104-4732806-7470339?ie=UTF8&s=books&qid=1179873697&sr=8-1' (length=149) 
    1 => string '0764584367' (length=10) 

Et $matches[1] est 0764584367.

+3

merci pour une explication géniale, simple et élégante. et encore plus pour aller au-delà. C'est une grande communauté et vous en êtes un brillant exemple. – jkatzer

+0

De rien :-) Amusez-vous! –

+0

Super réponse! J'utilise une version légèrement modifiée de ceci. Tout d'abord, tous les produits amazon ne sont pas sur amazon.com (il existe d'autres tld, ainsi que astore.amazon.com). Deuxièmement, l'ASIN peut être suivi par un? dans certains cas. En tant que tel, j'utilise "$ reg = '# (?: (?:/Dp/|/gp/produit/|/detail /))(.*?)(?:/.* | \ ?.* | $) # '; "et ensuite pour valider, je m'assure que le candidat ASIN apparié est en effet 10 caractères – Mala

0

On dirait que le problème est qu'il essaie d'utiliser des parenthèses comme délimiteur d'expression régulière begin/end. Voici un exemple de la page man:

$pattern = '/^def/'; 

Si vous utilisez slash comme séparateur begin/expression de fin, il sera difficile d'écrire votre expression régulière. Je suggère d'utiliser le signe dièse ('#') pour l'expression régulière car vous devrez échapper à moins de caractères.

Voici ce que j'ai fini avec:

<?php 

$example_url = 'http://www.amazon.com/Server-Side-Programming-Techniques-Performance-Scalability/dp/0201704293'; 

$reg = "#(?:http://(?:www\.){0,1}amazon\.com(?:/.*){0,1}(?:/dp/|/gp/product/))(.*?)(?:/.*|$)#"; 

echo 'test<br/>'; 

echo preg_match($reg, $example_url); 

?> 
+1

merci pour un génial répondre ainsi .. et n'hésitez pas à être inclus sur le commentaire que j'ai écrit ci-dessus pour la première réponse. – jkatzer

Questions connexes