relative naar absolute url’s
April 4th, 2007 by TijsIk was een functie aan het schrijven om relative urls om te zetten naar absolute. Bijvoorbeeld:
PHP:
-
... href="/foo.php?bar=1" ...
moet worden vervangen door
PHP:
-
... href="http://www.example.net/foo.php?bar=1" ...
Aangezien ik hier wel wat moeite mee gehad heb, deel ik graag de functie.
PHP:
-
/**
-
* Convert relative urls into absolute urls
-
*
-
* @param string $prefix
-
* @param string $text
-
* @return string
-
*/
-
function relativeToAbsolute($prefix, $text)
-
{
-
// search for single quotes and replace them by double quotes
-
$search = '\'';
-
$replace = '"';
-
-
// replace relative urls by absolute (prefix them with $prefix)
-
$pattern = '/href="(?!http|https|ftp|irc|feed|mailto)([\/]?)(.*)"/i';
-
$replace = 'href="'.$prefix.'/$2"';
-
-
// return
-
return $text;
-
}
April 4th, 2007 at 15:46
Kan je niet …..href=”./foo.php?bar=1″….. plaatsen en een baseref in de header meegeven?
April 4th, 2007 at 18:25
Ik merkte twee fouten.
1. Het stukje .* is greedy. Dit betekent dat het zo’n groot mogelijk patroon omvat, de expressie matcht dus niet de inhoud van de href maar alles na de eerste href=”/? tot aan de laatste ” van de lijn. De bug die zal optreden is dat als er meer dan 1 relatieve link op een lijn staat enkel de eerste de prefix zal krijgen.
Het is heel makkelijk op te lossen gewoon ungreedy maken: .*? (of de U pattern modifier toevoegen)
2. Dit is meer een fout tegen de theorie. Je hebt relatieve urls welke ten opzichte van de huidige directory zijn en absolute urls (beginnende met /) welke ten opzichtte van de root dir zijn. Omwille dat je ([\/]?) schrijft match je beiden wat dus fouten geeft in het geval dat je in een subdir zit. Je moet dus eigenlijk 2 parameters hebben om correct te zijn (url en dir) en alletwee de gevallen behandelen.
Voorbeeld: stel je hebt een pagina op http://site/blog en je gebruikt jouw functie dan zullen of de relatieve (gelegen relatief tov /blog) verkeerd zijn of de absolute (gelegen tov /).
Tenslotte nog een hint, / moet niet gebruikt worden als afsluiting van een pattern, in dit geval zou # makkelijker zijn. Dat zou het volgende opleveren:
#href=”(?!http|https|ftp|irc|feed|mailto)/?(.*?)”#i
(inclusief greedy fix, je match is $1)
April 4th, 2007 at 20:57
Inderdaad, Bernard van Openminds wees me deze morgen ook op de greedy-part.
Het tweede begrijp ik niet helemaal. Eigenlijk is mijn terminologie fout, absolute zou eigenlijk ‘full url’ moeten zijn.
Ik wil namelijk dat alle url die niet naar een externe site wijzen vervangen worden door de volledige url van de website.
April 5th, 2007 at 15:20
Bij het 2de bedoel ik dat je 2 soorten interne links hebt. Stel je hebt een pagina http://www.site.be/blog/index.html
Nu kun je twee soorten interne link hebben:
1. absolute die wijzen naar de root van de site en beginnen met / Bvb /style/global.css welke omgevormd moet worden tot http://www.site.be/style/global.css
2. relatieve die beginnen niet met / en wijzen relatief tov de huidige dir. Als je dus op de pagina een link zou hebben artikel.html dan moet dit vervangen worden door http://www.site.be/blog/artikel.html
Dus als je als prefix http://www.site.be/blog/ zou gebruiken zouden de absolute urls fout zijn, wanneer je als prefix http://www.site.be/ zou gebruiken dan zullen de relatieve urls verkeerd zijn.
Je moet dus de parameter $prefix vervangen door 2 parameters $url en $dir en degene die met een / beginnen vervangen door $url/ en degene die niet met / beginnen vervangen door $url.$dir/
June 15th, 2007 at 13:23
ik zou graag hebben , als men op mijn sitenaam klikt ,men automatisch op mijn blog komt, ik mis een url
June 15th, 2007 at 13:25
ik zoek al dagen en vind nergens hoe het moet,graag hulp aub
February 1st, 2010 at 06:34
Guida, meanwhile, has lost his past two outings, most recently falling prey to Kenny Florian by submission at UFC 107. Before that, “The Carpenter” was bested in a gritty decision loss to Diego Sanchez at The Ultimate Fighter 9 Finale, a bout that was ultimately awarded both by MMAjunkie.com readers and at the 2009 Fighters Only Mixed Martial Arts Awards as the “Fight of the Year.”
May 22nd, 2010 at 20:06
UFC 114 will have a great deal of fits, but none at the magnitude of the bout between Quinton Jackson and Rashad Evans. This is 1 of the most anticipated match-ups, which will lastly take site this month.
June 11th, 2010 at 23:55
I was just doing some surfing on my iPhone during my break at work , and I happened across something I thought was intriguing. It linked over to your site so I came over. I can’t really find the relevance between your site and the one I came from, but your site good none the less .
July 5th, 2010 at 05:09
Hey, I think your mostly on point with this, I won’t say I totally agree , but its not really that much of a issue.
August 26th, 2010 at 21:13
Its very hard in my situation to keep reading your blog post considering the fact that there are problematic pics across the page.