Preg_replace i.v.m. klikbaren url maar nu zonder laatste punt
Werkt perfect! Echter als de url als laatste in de tekst staat gevolgd door een punt, wordt de punt ook toegevoegd tot de url en is de url dus fout. Het gaat overigens alleen fout wanneer er een slash in de url zit.
Voorbeeld:
Dit kun je bekijken op www.nu.nl/evenement.
De laatste punt wordt dus gewoon toegevoegd tot de url en deze werkt dan niet.
Wanneer ik alleen www.nu.nl. in de tekst neerzet gaat het wel goed. Ook dit forum kan niet goed met de laatste punt van de url omgaan. Hoe zou ik dit kunnen oplossen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
function link_replace($bericht) {
$bericht = preg_replace("#(^|[ \n\r\t])((http(s?)://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])((ftp://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#([a-z_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)#","<a href=\"mailto:\\1\">\\1</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(www\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(ftp\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"ftp://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = nl2br($bericht);
return $bericht;
}
[/code]
function link_replace($bericht) {
$bericht = preg_replace("#(^|[ \n\r\t])((http(s?)://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])((ftp://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#([a-z_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)#","<a href=\"mailto:\\1\">\\1</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(www\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(ftp\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"ftp://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = nl2br($bericht);
return $bericht;
}
[/code]
Gewijzigd op 06/03/2020 23:59:56 door - Ariën -
Ik ben zelf geen held in reg-ex'jes, maar met een beetje speuren kwam ik deze tegen:
Code (php)
1
^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$
Hij ziet er uitgebreid uit omdat deze ook een herkenning heeft voor IP-adressen in diverse soorten en maten.
Of je maakt de functionaliteit gewoon dommer waarbij je zelf moet aangeven wat bij de link hoort. Er is dan geen enkele ruimte voor eigen (en dus mogelijk verkeerde) interpretatie.
Gewijzigd op 07/03/2020 09:02:45 door - Ariën -
(\.[a-z0-9_-]+)+)
in de eerste regex. Daarin geef je aan dat er een punt meegenomen wordt.
Een vergelijkbaar probleem zou je dan ook met een - moeten hebben, die ook niet aan het einde van een url mag staan.
in denk dat de oplossing ligt in iets met
(\.[a-z0-9_-]+)([a-z0-9])+)
Waarbij natuurlijk de url voor www.köln.de weer gemist wordt.
Ik zou ook via google proberen te zoeken naar een oplossing die iemand anders al uitgedacht heeft
Code (php)
1
$bericht = preg_replace("#(^|[ \n\r\t])(www\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $bericht);
- eerst www.
- dan evt. iets (1 of meer) met letters, cijfers, underscore of streep = [a-z0-9_-]+
- dan een punt en wederom \.[a-z0-9_-]+ (= de extensie = .nl)
- en dan evt. nog een slash met daarachter (komt ie): alles behalve slash, spatie, en regeleinden = [^/ \n\r] (0 of meer).
Die laatste pakt dus ook de punt mee. En als je hier dus van maakt "alles behalve slash, spatie, regeleinden, *en punt*", dan gaat ie wel goed.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
function link_replace($bericht) {
$bericht = preg_replace("#(^|[ \n\r\t])((http(s?)://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])((ftp://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#([a-z_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)#","<a href=\"mailto:\\1\">\\1</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(www\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r\.]*)*)#","\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(ftp\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"ftp://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = nl2br($bericht);
return $bericht;
}
?>
function link_replace($bericht) {
$bericht = preg_replace("#(^|[ \n\r\t])((http(s?)://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])((ftp://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#([a-z_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)#","<a href=\"mailto:\\1\">\\1</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(www\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r\.]*)*)#","\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(ftp\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"ftp://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = nl2br($bericht);
return $bericht;
}
?>
(geen garantie dat er nu niet iets anders stuk is ...)
Gewijzigd op 07/03/2020 13:32:38 door Rob Doemaarwat
- Ariën - op 07/03/2020 09:02:02:
Dan is de kracht van een 'automatische link generator weg'. Of leg jij graag Truus en Bep de UBB/Markup-codes uit?
Je beroepen op het argument dat Bep en Truus niks kunnen is niet erg zinvol. Op het moment dat je met contentbeheer bezig bent moet je wel enigszins weten waar je mee bezig bent. Als je incompetentie als uitganspunt neemt ben je snel klaar...
Plus hier ga je voorbij aan de mogelijkheid dat mensen af en toe eens wat nieuwe dingen moeten leren om te kunnen bereiken wat ze willen. En vaak is dat lang niet zo lastig als je hierboven schetst.
Ook ga je hierbij uit van een zeker gebruikersniveau dat vastgeschroefd staat op een bepaald niveau. Dat lijkt mij niet echt een sterke reden om een potentiële oplossing op voorhand af te schrijven, te meer omdat je niet weet wie dit systeem gaat gebruiken en hoe vaardig die mensen zijn.
Ik ben voorstander van dingen zo simpel mogelijk houden, maar niet simpeler. Als automatische selecties niet doen wat je wilt heb je weinig aan de regex-aanpak. Tijd om dan de controle meer in eigen hand te nemen?
Maak de functionaliteit simpel en wat lastiger/omslachtiger in het gebruik waarbij je zelf wat opmaak toevoegt, of
maak de functionaliteit "ingewikkeld" om te programmeren (lees: gebruik een WYSIWYG editor / doe wat meer moeite) en makkelijker in het gebruik door gewoon tekst te selecteren en dan te markeren als link. Waarschijnlijk zijn er wel WYSIWYG-editors of plugins hiervoor die dit doen.
Beide varianten geven je allebei wat je wilt: een precieze controle over wat hyperlink is, en wat niet. Als je deze extra stap niet wilt zetten zul je genoegen moeten nemen met het feit dat selecties af en toe misgaan.
Rob Doemaarwat op 07/03/2020 12:40:11:
(geen garantie dat er nu niet iets anders stuk is ...)
En ja, d'r is wat stuk. Het gaat nu niet meer goed bij bijvoorbeeld 'Dit kun je bekijken op www.nu.nl/evenement.html. bla bla'. Die punt voor .html hoort er natuurlijk weer wel bij (maar wordt met bovenstaande 'oplossing' ook buitengesloten) ... Dus het moet iets worden ala:
- alles behalve slash, spatie, en regeleinden
- en voor het *laatste karakter*: alles behalve slash, spatie, regeleinden, *en punt*
Voorheen was het echter 'nul of meer' (de '*' er achter), maar door die laatste voorwaarde wordt het dan automatisch 'minimaal 1 karakter'. Dus dan moet je het hele stuk weer optioneel maken (...)?, anders gaat er *weer* wat anders stuk. Kortom:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
function link_replace($bericht) {
$bericht = preg_replace("#(^|[ \n\r\t])((http(s?)://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])((ftp://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#([a-z_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)#","<a href=\"mailto:\\1\">\\1</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(www\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/([^/ \n\r]*[^/ \n\r\.])*)?)#","\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(ftp\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"ftp://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = nl2br($bericht);
return $bericht;
}
?>
function link_replace($bericht) {
$bericht = preg_replace("#(^|[ \n\r\t])((http(s?)://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])((ftp://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#([a-z_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)#","<a href=\"mailto:\\1\">\\1</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(www\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/([^/ \n\r]*[^/ \n\r\.])*)?)#","\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(ftp\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"ftp://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = nl2br($bericht);
return $bericht;
}
?>
(wederom: garantie tot de deur)
Thomas van den Heuvel op 07/03/2020 13:13:36:
Je beroepen op het argument dat Bep en Truus niks kunnen is niet erg zinvol. Op het moment dat je met contentbeheer bezig bent moet je wel enigszins weten waar je mee bezig bent. Als je incompetentie als uitganspunt neemt ben je snel klaar...
- Ariën - op 07/03/2020 09:02:02:
Dan is de kracht van een 'automatische link generator weg'. Of leg jij graag Truus en Bep de UBB/Markup-codes uit?
Je beroepen op het argument dat Bep en Truus niks kunnen is niet erg zinvol. Op het moment dat je met contentbeheer bezig bent moet je wel enigszins weten waar je mee bezig bent. Als je incompetentie als uitganspunt neemt ben je snel klaar...
Persoonlijk vind ik dit een flinke dooddoener, als je niet iets gebruiksvriendelijk wil houden.
Gewijzigd op 07/03/2020 15:23:24 door - Ariën -
Rob Doemaarwat op 07/03/2020 13:37:49:
(wederom: garantie tot de deur)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
function link_replace($bericht) {
$bericht = preg_replace("#(^|[ \n\r\t])((http(s?)://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])((ftp://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#([a-z_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)#","<a href=\"mailto:\\1\">\\1</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(www\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/([^/ \n\r]*[^/ \n\r\.])*)?)#","\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(ftp\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"ftp://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = nl2br($bericht);
return $bericht;
}
?>
function link_replace($bericht) {
$bericht = preg_replace("#(^|[ \n\r\t])((http(s?)://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])((ftp://)(www\.)?([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#([a-z_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)#","<a href=\"mailto:\\1\">\\1</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(www\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/([^/ \n\r]*[^/ \n\r\.])*)?)#","\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = preg_replace("#(^|[ \n\r\t])(ftp\.([a-z0-9_-]+(\.[a-z0-9_-]+)+)(/[^/ \n\r]*)*)#","\\1<a href=\"ftp://\\2\" target=\"_blank\">\\2</a>", $bericht);
$bericht = nl2br($bericht);
return $bericht;
}
?>
(wederom: garantie tot de deur)
Dank je Rob! Dit werkt!!!
Gewijzigd op 31/03/2020 15:06:44 door Nicos Vermeulen
@Nicos hoe worden deze teksten ingevoerd? Als plaintext? Heb je ook over veiligheid nagedacht? Tenzij je de berichtenschrijvers vertrouwt en/of bekend is wie dit zijn loont het misschien de moeite om alle output die geproduceerd wordt op een of andere manier te escapen? Wat als iemand hier JavaScript in verwerkt? Werkt dat dan ook?
Wat gebeurt er bijvoorbeeld als je het volgende in een bericht zet?
Gewijzigd op 31/03/2020 16:57:08 door Thomas van den Heuvel