[php] regular expression probleem, vervangen links in docume

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Ik heb een naar mij lijkt vrij eenvoudig probleem, maar ik kom er niet uit.

Ik wil van een gegeven htm(l) document de links vervangen tot bepaalde code, behalve die links die naar een externe site verwijzen. Anders gezegd: alle links vervangen, behalve die beginnen met http: (of ftp, dat maakt me niet uit).

Probleem is dat alle onderstaande grove code niet werkt en ik niet inzie waar het nu misgaat. Wil iemand even helpen? Zoeken op de tutorials van regular expressions helpt me erg weinig, want ik zie nergens staan hoe ik een string uitsluit. Wel staat overal [^a-z] voor het uitsluiten van alle letters, maar dat gaat wat ver....

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

$tekst = "<p><a href=\x22http://www.nu.nl/\x22>nu.nl</a>";
$tekst .= "<p><a href=\x22test.htm\x22>test</a>";

eregi_replace("href=\x22(^http)(\.[a-z0-9-]+)*\x22","href=\x22index.php?file=",$tekst);
echo $tekst;

eregi_replace("/href=\x22[^http](.*)\x22/","href=\x22index.php?file=",$tekst);
echo "<hr>".$tekst;

eregi_replace("/href=\x22(^http)(.*)\x22/","href=\x22index.php?file=",$tekst);
echo "<hr>".$tekst;

eregi_replace("href=\x22(^http)(.*)\x22","href=\x22index.php?file=",$tekst);
echo "<hr>".$tekst;

eregi_replace("href=\x22.*\x22","href=\x22index.php?file=",$tekst);
echo "<hr>".$tekst;

?>

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
PHP:
1
2
3
4
5
preg_replace(
  "/href=\x22(?!http:\/\/)([^\x22]+)\x22/",
  "href=\x22index.php?file=\\1\x22",
  $tekst
);


Ik weet niet zeker of het klopt zo, moet je maar even testen anders.

[ Voor 14% gewijzigd door Michali op 26-11-2004 11:24 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Michali schreef op vrijdag 26 november 2004 @ 11:23:
PHP:
1
2
3
4
5
preg_replace(
  "/href=\x22(?!http:\/\/)([^\x22]+)\x22/",
  "href=\x22index.php?file=\\1\x22",
  $tekst
);


Ik weet niet zeker of het klopt zo, moet je maar even testen anders.
Nee, helaas. Je gebruikt een uitroepteken in je functie, die ben ik nog in geen turorial tegengekomen. Waarom staat die daar? Dan kan ik wellicht proberen zelf verder te prustsen

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

?! staat voor negative lookahead.

Waar staat die \x22 voor? Bedoel je niet \\x22?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
PHP:
1
2
3
4
5
preg_replace(
  '/href="(?!http:\/\/)([^"]+)"/',
  'href="index.php?file=\1"',
  $tekst
);

Probeer dit anders eens.

Syntax van preg functie regexen kun je hier vinden: http://www.php.net/manual...e.pcre.pattern.syntax.php

[ Voor 12% gewijzigd door Michali op 29-11-2004 15:43 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
Michali schreef op maandag 29 november 2004 @ 15:43:
PHP:
1
2
3
4
5
preg_replace(
  '/href="(?!http:\/\/)([^"]+)"/',
  'href="index.php?file=\1"',
  $tekst
);

Probeer dit anders eens.
Helaas, ook dat helpt nog niet. Wellicht dat je zo nog wat anders paraat hebt?

Strikt genomen kan ik natuurlijk alles wat begint met 'href=\x22' laten vervangen, om daarna alles met 'href=\x22index.php?file=http:\/\/' weer terug te laten zetten, maar echt netjes is dat niet. Dat moet toch ook wel ineens kunnen?
Syntax van preg functie regexen kun je hier vinden: http://www.php.net/manual...e.pcre.pattern.syntax.php
Zodra ik wat meer tijd vind duik ik hier wel eens wat dieper in. Voor dit moment hoop ik dat iemand de situatie wellicht kent en dus even wat kan posten.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zoals ik al zei:
-NMe- schreef op vrijdag 26 november 2004 @ 12:41:
Waar staat die \x22 voor? Bedoel je niet \\x22?
Een \ staat in een regular expression, net als in PHP, voor een escape character. Je escapet nu een x, terwijl je letterlijk een \ wil vervangen. Daarvoor moet je dus \\ gebruiken.
TromboneFreakus schreef op donderdag 02 december 2004 @ 13:48:
Zodra ik wat meer tijd vind duik ik hier wel eens wat dieper in. Voor dit moment hoop ik dat iemand de situatie wellicht kent en dus even wat kan posten.
Dat getuigt niet echt van eigen inzet, vind je ook niet?

[ Voor 33% gewijzigd door NMe op 02-12-2004 20:25 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • TromboneFreakus
  • Registratie: Juli 2001
  • Laatst online: 01-08-2023
-NMe- schreef op donderdag 02 december 2004 @ 20:24:
[...]

Dat getuigt niet echt van eigen inzet, vind je ook niet?
Klopt, maar zoals ik al zei... wellicht dat iemand het zo weet. Het gros van de problemen die ik zelf op forum beantwoord zijn immers vaak met Google ook zo op te lossen, dus het is geven en nemen.

Mijn huidige (neven)activiteiten (studentenraad, bestuur, commissie en twee studies) maken het op dit moment gewoon erg druk. Maar voor een van die nevenactiviteiten zou ik dit stukje code goed kunnen gebruiken.

Anyway, ik pruts tzt wel een keer verder.
Pagina: 1