[PHP] Regex relatieve links domein naar absolute

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de volgende string:
PHP:
1
2
3
4
$content = "<a href=\"www.4-4-14-zeilen.nl\" target=\"_blank\"><img class=\"left\" \n".
           "   src=\"images/news/4-4-14_logo.jpg\" alt=\"\" /></a>\n".
           "De <a href=\"http://www.4-4-14-zeilen.nl\" target=\"_blank\">4-4-14</a> formule!!!</p><br />\n".
           "<p><a href=\"portfolio.php?id=14\" class=\"smalltext\">(zie portfolio)</a></p>";


Nou wil ik zorgen dat relatieve links absolute links worden naar mijn domein (voor in mijn RSS feed). Dus portfolio.php?id=14 (relatief) moet worden http://www.rszdesign.com/portfolio.php?id=14 en daarnaast moet www.4-4-14-zeilen.nl naar http://www.4-4-14-zeilen.nl veranderd. En absolute links (die beginnen met een protocol http:// of andere) moeten natuurlijk onveranderd blijven.

Ik heb de volgende patterns geprobeerd: (incomplete patterns uitge-comment)
PHP:
1
2
3
4
5
6
//$new_content = preg_replace( "'href=\"http://(.*?)\"'si", "href=\"\$1\"", $content );
//$new_content = preg_replace( "'#(http://)([^\s]*)#e'", 'href="\\1"', $content );
//$new_content = preg_replace( '/(?<!href=\")(http|ftp)+(s)?:(\\/\\/)((\\w|\\.)+) (\\/)?(\\S)/i', 'href="http://\\1"', $content );
$new_content = preg_replace( "'href=\"(www\.)(.*?)\"'si", "href=\"http://\\1\\2\"", $content );
//$new_content = preg_replace( "'href=\"(\w+:\/\/)(.*?)\"'si", "href=\"http://www.rszdesign.com/\\1\\2\"", $new_content );
$new_content = preg_replace( "'href=\"([^http:\/\/])(.*?)\"'si", "href=\"http://www.rszdesign.com/\\1\\2\"", $new_content );


Ik heb gezocht op Google en GoT, maar ik kan nergens vinden hoe ik kan zorgen dat ik kan aangeven met regex dat ik een replace wil uitvoeren wanneer het ene niet matcht en het andere wél.

Bij voorbaat dank voor de hulp!

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 21-09 00:18
Ik heb gezocht op Google en GoT, maar ik kan nergens vinden hoe ik kan zorgen dat ik kan aangeven met regex dat ik een replace wil uitvoeren wanneer het ene niet matcht en het andere wél.
Volgens mij moet je het dan gewoon in array zetten en doorlopen..

|>


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik snap niet precies wat je bedoelt en weet je zeker dat dit niet met regex kan??

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Wat jij wilt is onmogelijk aangezien er in je voorbeelden niet ambigu zijn. Je kunt niet zien of www.4-4-14-zeilen.nl een hostnaam is, of gewoon een directory naam. Je bron gegevens zijn dus al vervuild.

Het onderscheid tussen een absolute en relatieve link wordt gemaakt door het al dan niet aanwezig zijn van het protocol. Zo doet de browser het ook. Het bovenste voorbeeld zal door je browser in de site ook gewoon als relatieve url worden gezien en sowieso al niet werken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

en het zou je regexen een stuk makkelijker maken als je ervoor kan zorgen dat in $content de href naar www.4-4-14-zeilen.nl al http:// ervoor heeft staan.

tis namelijk niet zo logisch (vanaf hier gezien) dat de eerste href naar www.4-4-14-zeilen.nl geen http:// ervoor heeft en de tweede wel

dan hoef je namelijk maar 1 regex te maken die op "portfolio.php" een relatieve link matched en daar het het absolute pad voor zet.

en als dat niet lukt kan je het met conditional sub patterns proberen

[ Voor 8% gewijzigd door Verwijderd op 21-03-2005 11:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OK, ik snap jullie punt betreft het volledige adres zonder de http://
Eerlijk gezegd staat die in de originele website niet zo, maar heb ik dit voor het voorbeeld even zo gedaan zodat ik kon zien wat er nou precies vervangen werd (en wat niet) door de preg_replace().

Mijn vraag is dus; hoe kan ik met regex aangeven wanneer string tussen "" in href="" géén http:// (of ander protocol) bevat, replace string met ("http://www.rszdesign/" + string)??

De relatieve pagina hoeft namelijk niet altijd "porftolio.php" te zijn...

[ Voor 23% gewijzigd door Verwijderd op 22-03-2005 13:15 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 22 maart 2005 @ 13:13:
OK, ik snap jullie punt betreft het volledige adres zonder de http://
Eerlijk gezegd staat die in de originele website niet zo, maar heb ik dit voor het voorbeeld even zo gedaan zodat ik kon zien wat er nou precies vervangen werd (en wat niet) door de preg_replace().

Mijn vraag is dus; hoe kan ik met regex aangeven wanneer string tussen "" in href="" géén http:// (of ander protocol) bevat, replace string met ("http://www.rszdesign/" + string)??

De relatieve pagina hoeft namelijk niet altijd "porftolio.php" te zijn...
s/^(?<!http://).+$/http://www.rszdesign/ + string

(perlnotatie zonder de backslashes)

[ Voor 34% gewijzigd door Verwijderd op 22-03-2005 14:41 ]


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 23:00
@gerritteunissen: volgens mij ondersteunt PHP geen look-behinds en al helemaal geen negatieve look-behinds...Maar zou natuurlijk kunnen dat ze de PCRE inmiddels up to dat hebben...

Overigens zou je ook voor alle links die niet met "www." of "http://" beginnen ook met file_exists() kunnen kijken of de file bestaat. Als dat het geval is weet je (vrijwel) zeker dat het om een relatieve link gaat. Dan kun je er vervolgens http://www.server.nl/ voor plakken. In die file_exists() wel even het pad gebruiken van de file waar de link instaat natuurlijk...

[ Voor 53% gewijzigd door Morrar op 22-03-2005 15:01 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Morrar schreef op dinsdag 22 maart 2005 @ 14:45:
@gerritteunissen: volgens mij ondersteunt PHP geen look-behinds en al helemaal geen negatieve look-behinds...Maar zou natuurlijk kunnen dat ze de PCRE inmiddels up to dat hebben...
worden al een hele tijd ondersteund hoor ;)

Intentionally left blank

Pagina: 1