2010-08-12 6 views
4

J'ai besoin d'un moyen de prendre un bloc de code HTML et de rendre toutes les URL absolues. J'ai essayé d'adopter divers exemples de regex, mais je n'ai pas eu de chance. Ce sont les exigences:REGEX: Rendre toutes les URL absolues

  • Remplacer les deux HREF et SRC urls
  • Si l'URL est déjà absolue, laissez
  • Si l'URL est absolue, remplacez-le

Chaque HTML provient d'une connue URL (example.com/folder/file.html) pouvant être utilisée pour créer les URL absolues. Par exemple:

src = "image.png" devient src = "http://example.com/dossier/image.png" href = "/ home.html" devient href = "http: // exemple .com/home.html »

J'ai trouvé une fonction qui fait exactement ce que je dois:

http://nashruddin.com/PHP_Script_for_Converting_Relative_to_Absolute_URL

Mais je ne peux pas comprendre comment le faire en vrac, pour toutes les URL dans un bloc de code.

Toute aide serait géniale!

Cheers.

+0

Possible duplication: http://stackoverflow.com/questions/2869844/regex-to-replace-relative-link-with-root-relative-link –

+0

Il est légèrement différent, mais la solution (en utilisant l'étiquette de base) fonctionne également dans ce cas. –

Répondre

1

quelque chose comme ça peut travail

$html = preg_replace_callback(
     '~((href|src)\s*=\s*[\"\'])([^\"\']+)~i', 
     'replace', 
     $html); 

    function replace($x) { 
    $url = $x[3]; 
    $url = your_url_conversion_function($url); 
    return $x[1] . $url; 
    } 

cela échouera si votre code html contient "href" ou "src" tags à l'extérieur, comme dans <h1> how to use "src=" </h1>. C'est pourquoi les gens suggèrent généralement des analyseurs dédiés, et non des expressions rationnelles, pour le HTML.

+0

Pour autant que je puisse voir, cela fonctionne un régal. Je sais que regex en html ne sera jamais parfait, mais cela fera l'affaire pour le moment. Merci pour la réponse rapide! –

3

Don't use regular expressions to parse (X)HTML - ce que vous voulez faire est d'utiliser un analyseur SGML ou XML, et utiliser une expression régulière sur les attributs d'élément pertinents à la place.

+0

Hehe. Point pris. Pour l'instant, c'est un hack expérimental, mais je vais certainement envisager un analyseur approprié dans le futur. Merci. –