[php] vervangen relative door absolute urls in html mbv ereg

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
hi ik kom er niet uit, zit al 2 uur te kl*ten op een regexp in php. wat ik wil is een lap html waarin "a href" en "img src" tags staan doorlopen en alleen de relatieve url's vervangen door een absolute. bijv:

[img]'bol.gif'>[/img] moeten worden, maar <a href="http://www.google.com">google</a> mag niet vervangen worden.

nu zit ik met het probleem dat er geen NOT operator op strings is in ereg, alleen een NOT operator op single characters. dit is waar ik tot nu toe ben gekomen:
code:
1
return   eregi_replace("src=[\"|\']?([^\"\']*)[\"|\']", "src=\"{$urlbase}\\1\"", $string);


levert een src waar ALTIJD een absolute url van gemaakt wordt.

code:
1
return   eregi_replace("src=[\"|\']([^http])([^\"\']*)[\"|\']", "src=\"{$urlbase}\\1\\2\"", $string);


vervangt alleen de src als die oorspronkelijk geen h, t, t of p teken bevat.

help!

[ Voor 16% gewijzigd door js303 op 24-11-2004 17:29 ]


  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
niemand een antwoord?

Verwijderd

js303 schreef op woensdag 24 november 2004 @ 17:21:
hi ik kom er niet uit, zit al 2 uur te kl*ten op een regexp in php. wat ik wil is een lap html waarin "a href" en "img src" tags staan doorlopen en alleen de relatieve url's vervangen door een absolute. bijv:

[img]'bol.gif'>[/img] moeten worden, maar <a href="http://www.google.com">google</a> mag niet vervangen worden.
Ik ben absoluut geen rex-exp ster, dus vergeef me als wat ik zeg niet klopt of eenvoudiger kan.. :)

Ten eerste is op Google een en ander te vinden.

Ten tweede, als je niet op 'niet' kan matchen lijkt het me dat je eerst de de gehele tag matcht op < img > en < a ></a> en output naar een array met preg_match_all.
vervolgens per match kijken of er 'http' in voorkomt met preg_match. Degene waar het wel het geval is doe je niets mee, bij diegene waar het niet het geval is zet je http://mijnsite/ in de source. De url die je vervangen hebt en de oude url zet je in twee array's bijv. $search voor de oude en $replace voor die nieuwe, die twee array's gooi je door preg_replace en klaar :?

Maar nogmaals, misschien kan het veel eenvoudiger met 1 mooie rex exp replace, hoop in ieder geval dat ik je een beetje geholpen heb. ;)

  • js303
  • Registratie: April 2003
  • Laatst online: 01-06 10:17
hmmm, preg_match_all had ik nog niet nader onderzocht, ook vanwege het feit dat ik het liefst alles in 1 regexp wil doen. maar ik ga het zeker even proberen.

heb intussen een 'dirty trick' gevonden die alleen een absolute URL toevoegt als in de HREF of een SRC een : staat na 4 chars (zoals http:) zie (....[^:])

code:
1
2
3
function hrefreplace($string, $urlbase) {
  return eregi_replace("(href=|src=)[\"|\'](....[^:])([^\"\']*)[\"|\']", "\\1\"{$urlbase}\\2\\3\"", $string);
}


echt mooi is het niet want bijv. <a href="ftp://server.com"> zal hij dus alsnog voorzien van de absolute url aangezien ftp: geen 4 maar 3 chars is.

UPDATE: er zit nog een 'bug' in bovenstaande functie: indien een href of src minder dan 4 chars lang is, bijv. href="#" dan slaat hij de 2e quote over waardoor je hele html in de soep raakt... damn!

UPDATE: ik heb nu toch maar via preg_match een functietje gemaakt, tis alleen niet echt compact...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    function replace_urls($text, $url) {

        $pattern = "/(href=|src=)(['|\x22][^'|\x22]*.)/i";

        preg_match_all($pattern, $text, $matches, PREG_PATTERN_ORDER);

        for ($m = 0; $m < count($matches[2]); $m++) {

            $str = str_replace(array("'","\x22"), "", $matches[2][$m]);

            if (!preg_match("/(^#|http:|ftp:|javascript:)/i", $str)) {
                $matches[1][$m] = $matches[1][$m] . "\x22" . $url . $str . "\x22";
            } else {
                $matches[1][$m] = $matches[1][$m] . $matches[2][$m];
            }
        }

        $text = str_replace($matches[0], $matches[1], $text);
        return $text;
    }

print replace_urls("<a href=index.php?objid=1'>", "http://www.site.nl/");

[ Voor 58% gewijzigd door js303 op 25-11-2004 16:10 ]


  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Hier is een preg_match patroon dat alleen url's oppakt die niet beginnen met http.
Het maakt gebruik van een 'Lookahead assertion'.
PHP:
1
$pattern = "/((?:src|href)=['\"])(?!http)([^'\"]+)(['\"])/";