2010-03-14 9 views
0

J'essaye de faire une URL qui ajoute un / à tous hrefs et srcs dans une chaîne. Il devrait seulement ajouter un / aux urls qui n'ont pas un http:// à leur début et qui n'ont pas encore /.URL de remplacement regex

Si nous avons ceci:

<a href="ABC">... 
<img src="DEFG">... 
<a href="/HIJ">... 
<a href="http://KLMN">... 

Les résultats devraient être quelque chose comme ceci:

<a href="/ABC">... 
<img src="/DEFG">... 
<a href="/HIJ">... 
<a href="http://KLMN">... 

C'est ce que je suis venu jusqu'à présent:

&(href|src)="?!(\/|http::\/\/)(.+)" 

Et le remplacement serait

$1="/$2" 

Cela ne fonctionne pas, cependant.

  • Qu'est-ce que je fais mal?
  • Comment le travail regex doivent ressembler à
+0

Qu'en est-il d'une URL comme 'foo/bar'? Il ne commence pas par '/' mais contient un '/'. – Gumbo

+0

I ment au début de l'URL – perf

+0

http :: -> http: – chelmertz

Répondre

0
$str = preg_replace('/(href|src)="([^\/][^:]*)"/', '\1="/\2"', $str) 

Cela fera ce que vous demandez, mais a une petite exception que toute chaîne contenant deux points (:) ne sera pas obtenir un «/» ajouté . Cela lui permet de gérer facilement http: //, ftp: //, etc, mais ne fonctionnera pas non plus pour quelque chose comme "abcd: efgh".

0

Ceci correspondra aux balises avec href ou src, et le premier groupe contient l'adresse.

(<[^<]*?(?:href|src)=")(?!http|/)(.+?)("[^<]*?>) 

Et remplacer par:

$1/$2$3 
1

Peut-être il suffit de changer simplement l'URI de base avec le base element:

<base href="/"> 

Maintenant, le chemin de l'URI de base est / au lieu du chemin de l'URI du document actuel. Mais notez que cela affecte tous les URI relatifs et pas seulement ceux avec un chemin URI relatif.

+0

Parfois, quand les gens ont un problème, ils pensent; Je sais, je vais utiliser Regex! Maintenant, ils ont deux problèmes. – Aistina

+0

@Aistina: Vous devriez publier cela comme une réponse afin que je puisse l'écarter. –

+0

@Alan: Parce que ...? – Aistina