2010-11-30 18 views
1

J'ai un peu de HTML de base que j'appelle str_replace(), j'ai besoin d'ajouter toutes les URL trouvées dans une chaîne HTML avec un 'generate_book.php?link=', mais j'ai besoin d'exclure les liens externes, par exemple;Qu'est-ce qu'une regex PHP pour cibler certaines URL?

<a href="gst/3.html">Link</a> - cela devrait devenir - <a href="generate_book.php?link=gst/3.html"></a>

<a href="http://example.com">Link</a> - cela devrait être laissé seul

Votre powa cerveau est apprécié!

Répondre

1

Vous voulez utiliser un look-ahead au début pour vous assurer qu'il ne correspond pas à HTTP ou HTTPS. Vous pouvez également ajouter mailto si vous êtes inquiet à ce sujet.

$str = preg_replace("/(?<=href=\")(?!http:\/\/|https:\/\/)([^\"]+)/i", "generate_book.php?link=$1", $str); 

Cette regex utilise également un coup d'oeil-derrière (le (?<=href=\")) afin qu'il ne correspond pas à la réalité href=".

Avertissements:

  • doivent être conscients de ce qui URL schemes sera dans le code HTML en plus HTTP et HTTPS, le cas échéant.
  • Certaines balises, telles que la balise link, ont également un attribut href. Assurez-vous de ne pas les remplacer. Si vous devez faire correspondre uniquement A étiquettes en utilisant l'expression rationnelle, la complexité de votre regex va croître considérablement et encore won't really be safe.
  • Regex Eval est beaucoup moins efficace et dangereux, mais si vous avez besoin d'encodage d'URL, vous pouvez tenter d'URL encoder remplacer au moment comme le deuxième retour de l'autre réponse fait. Dans l'ensemble, Regex n'est pas nécessairement la meilleure solution pour cela. Vous pourriez être mieux avec un analyseur HTML ...
+0

Ok, j'ai essayé toutes les suggestions sur cette page, mais elles génèrent toutes des erreurs. Le vôtre semble générer le moins avec: Avertissement: preg_replace() [function.preg-replace]: Modificateur inconnu '/' dans C: \ wamp \ www \ projets \ kineo \ taxteam \ [CD_COURSE] GCSB (Central) \ htdocs \ book \ generate_book.php on line 64 – danjah

+0

Oups, remplacez les deux '//' après le http/https avec '\/\ /' Je n'utilisais pas PHP pour tester l'expression régulière, donc je n'ai pas eu à leur échapper. – Nicole

+0

Cela fonctionne très bien pour moi, merci, je ne voulais pas effrayer quiconque avec le contexte dans lequel je l'utilise, mais c'est pour un paquet Server2Go gravé sur CDROM donc il y a très peu de danger, juste des liens brisés:) – danjah

0

pour cette solution:

$str = preg_replace(
    "(href=\"([^\"]+)\")ie", 
    "if(substr('$1',0,7) == 'http://') 
     return stripslashes('$1'); 
    else 
     return 'generate_book.php?link='.urlencode(stripslashes('$1'));", 
    $str); 
+0

Je suis sûr que vous ne pouvez pas simplement passer une fonction comme une chaîne là-bas. Ce que vous voulez, c'est 'preg_replace_callback()' et 'create_function()' (ou utilisez une fonction anonyme si vous utilisez> 5.3). – alex

+0

Le modificateur 'e' permet d'évaluer le paramètre' replace' en tant que code PHP [PHP.net PCRE modificateurs] (http://uk3.php.net/manual/fr/reference.pcre.pattern.modifiers.php) –

+0

Désolé d'être un n00b, @alex pourriez-vous s'il vous plaît me fournir un exemple de code de ce que vous voulez dire? Je pense que je suis, mais je suis aussi un novice complet :) – danjah