[php] preg_replace probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
$text = preg_replace("/\[url=(.+?)\](.+?)\\[\/url\]/is",'<a href="\1" target="_blank">\2</a>',$text);


wat deze code moet doen is dit [u rl=www.goole.com]leuke site[/url]
of [u rl=http://www.goolge.com]leuke site[/url] (natuurlijk zonder spatie).
Als ik nu www.google.com doe dan krijg ik ook nog eens (niet om gevraagd) het path er bij (uitvoer= http://server.nl/php/www.google.com).
Als ik http in mijn code zet dan krijg ik de juiste uitvoer maar dan werkt de andere weer niet.

Acties:
  • 0 Henk 'm!

  • BrZ
  • Registratie: Maart 2000
  • Laatst online: 13:20

BrZ

...

oeps... werkt dus ook niet... :/

[ Voor 85% gewijzigd door BrZ op 16-02-2003 15:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
misschien een beetje onaardige vraag... Kan je hem uit leggen? waarom i ipv is en waarom geen + ipv *

gewoon om meer inzicht op te doen, ik ben namelijk er nog neit echt helemaal uit hoe preg_replca systaxes werken

Ja lekker is dat dan, beetje foute code opgeven. :+

[ Voor 12% gewijzigd door Verwijderd op 16-02-2003 15:53 ]


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Probeer eens zoiets:
PHP:
1
2
$p = '_\\[url=(?:http://)?([^\]]+)\](.+?)\\[/url\]_is';
$r = '<a href="http://$1">$2</a>';

Niet getest, maar idee is duidelijk lijkt me...

[edit]
Kleine aanpassing, nu zal ie het vast doen.

Voor uitleg van bijvoorbeeld de modifiers (zoals /i en /s) kun je op www.php.net/pcre terecht.

[ Voor 53% gewijzigd door tomato op 16-02-2003 15:57 ]


Acties:
  • 0 Henk 'm!

  • BrZ
  • Registratie: Maart 2000
  • Laatst online: 13:20

BrZ

Verwijderd schreef op 16 februari 2003 @ 15:52:
misschien een beetje onaardige vraag... Kan je hem uit leggen? waarom i ipv is en waarom geen + ipv *

gewoon om meer inzicht op te doen, ik ben namelijk er nog neit echt helemaal uit hoe preg_replca systaxes werken

Ja lekker is dat dan, beetje foute code opgeven. :+
mja, sorry, hij deed blijkbaar exact hetzelfde als jouw code... moet ik mijn forum ook gaan fixen :D

Maar aan de andere kant is het wel logisch.. in html komt er te staan <a href="www.google.com"> en je browser maakt daar dan http://server/www.google.com van :)

Dus wat er moet gebeuren is dat hij controleerd of er http:// voor staat en zo neit, dan moet het ervoro gezet worden :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
het gekke is dat als je dit doet:
PHP:
1
2
3
<?php
$text = preg_replace("/\[url=http:\/\/(.+?)\](.+?)\\[\/url\]/is",'<a href="http://\1" target="_blank">\2</a>',$text);
?>

het ook weer http://server.nl/php/www.google.com oplevert. terwijl me het een jusite stelling lijkt (je kijkt eerst of het voor komt dan vervang je het met het zelfde: raar maar wel waar)

Acties:
  • 0 Henk 'm!

Verwijderd

Ik gebruikte altijd voor mijn forum deze code:

PHP:
1
2
3
<?
$Bericht = preg_replace("/(\[url=)(.*)(])(.*)(\\[\/url\])/siU", "<a href=\\2\ target=_New>\\4</a>", $Bericht);
?>



En deze vond ik altijd ook wel handig:

PHP:
1
2
3
<?
$Bericht = eregi_replace("(^|[\n\r\t<br>])((http(s?)://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)","\\1<a href=\\2\ target=_New>\\2</a>", $Bericht); 
?>

[ Voor 62% gewijzigd door Verwijderd op 16-02-2003 16:20 ]


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Verwijderd schreef op 16 februari 2003 @ 16:15:
Ik gebruikte altijd voor mijn forum deze code:

|code|
Lees aub de vraag voor je je code neer plant in het topic. Hier heeft de TS niets aan.

Ten eerste heeft hij/zij er niets aan als iedereen het stukje code dat hij/zij gebruikt geeft. Er zitten dan sowieso 80% identieke 'oplossingen' tussen en het is niet de bedoeling dat TS kan copy/pasten net zo lang tot hij/zij iets heeft dat werkt.

Ten tweede lost jouw stukje code het probleem niet op (het doet daar niet eens een poging toe) en ga je op geen enkele andere manier op de vraag in.

Acties:
  • 0 Henk 'm!

Verwijderd

tomato schreef op 16 February 2003 @ 16:20:
[...]

Lees aub de vraag voor je je code neer plant in het topic. Hier heeft de TS niets aan.

Ten eerste heeft hij/zij er niets aan als iedereen het stukje code dat hij/zij gebruikt geeft. Er zitten dan sowieso 80% identieke 'oplossingen' tussen en het is niet de bedoeling dat TS kan copy/pasten net zo lang tot hij/zij iets heeft dat werkt.

Ten tweede lost jouw stukje code het probleem niet op (het doet daar niet eens een poging toe) en ga je op geen enkele andere manier op de vraag in.
Ik heb het topic helemaal gelezen en ik geef enkele andere opties waar hij misschien iets (al is het misschien niet veel) aan kan hebben.

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Verwijderd schreef op 16 February 2003 @ 16:26:
Ik heb het topic helemaal gelezen en ik geef enkele andere opties waar hij misschien iets (al is het misschien niet veel) aan kan hebben.
Dat is heel leuk en ik geef toe dat de vraag van de TS misschien een beetje slecht geformuleerd is, maar je geeft toch echt geen antwoord waar hij iets aan heeft, ergo je hebt de vraag (niet goed) gelezen.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Wat er natuurlijk fout gaat is de enkele slash voor de replacement vars, die moet weer ge-escaped worden anders verwijs je naar de root van je eigen server, of beter nog gebruik $x:
PHP:
1
$text = preg_replace("/\[url=(.+?)\](.+?)\\[\/url\]/is",'<a href="$1" target="_blank">$2</a>',$text);

Ten tweede zou ik 'm ungreedy maken voor het geval je 2x een link in 1 bericht zet, en de http(s):// optioneel maken. Verder is de s modifier (waarmee je dus kijkt over meerdere regels) in dit geval ook overbodig, en is (.+) volgens mij gelijk aan (.+?):
PHP:
1
$text = preg_replace('/\[url=(http(s?):\/\/)??(.+)\](.+)\\[\/url\]/Ui', '<a href="http$2://$3" target="_blank">$4</a>', $text);

[ Voor 14% gewijzigd door crisp op 16-02-2003 17:17 ]

Intentionally left blank

Pagina: 1