Preg_replace i.v.m. klikbaren url maar nu zonder laatste punt

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nicos Vermeulen

Nicos Vermeulen

06/03/2020 23:04:43
Quote Anchor link
Ik maak gebruik van onderstaande functie om een url in een tekst om te zetten naar een klikbaren url.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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]
Gewijzigd op 06/03/2020 23:59:56 door - Ariën -
 
PHP hulp

PHP hulp

26/05/2020 10:38:12
 
- Ariën -
Beheerder

- Ariën -

07/03/2020 00:13:03
Quote Anchor link
Soms is het een sport om een fatsoenlijke rex-ex te maken die aan zoveel mogelijk eisen voldoet.
Ik ben zelf geen held in reg-ex'jes, maar met een beetje speuren kwam ik deze tegen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

07/03/2020 01:03:57
Quote Anchor link
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.
 
- Ariën -
Beheerder

- Ariën -

07/03/2020 09:02:02
Quote Anchor link
Dan is de kracht van een 'automatische link generator weg'. Of leg jij graag Truus en Bep de UBB/Markup-codes uit?
Gewijzigd op 07/03/2020 09:02:45 door - Ariën -
 
Ivo P

Ivo P

07/03/2020 12:14:23
Quote Anchor link
ik wil hem niet helemaal uitpuzzelen, maar volgens mij zit het in het stuk

(\.[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
 
Rob Doemaarwat

Rob Doemaarwat

07/03/2020 12:40:11
Quote Anchor link
Als je gewoon even overal print($bericht) tussen zet zie je dat ie in dit geval de replace op de 4e regel/variant doet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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);
Daar staat dus grofweg:
- 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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>

(geen garantie dat er nu niet iets anders stuk is ...)
Gewijzigd op 07/03/2020 13:32:38 door Rob Doemaarwat
 
Thomas van den Heuvel

Thomas van den Heuvel

07/03/2020 13:13:36
Quote Anchor link
- 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

Rob Doemaarwat

07/03/2020 13:37:49
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>

(wederom: garantie tot de deur)
 
- Ariën -
Beheerder

- Ariën -

07/03/2020 14:57:26
Quote Anchor link
Thomas van den Heuvel op 07/03/2020 13:13:36:
- 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 -
 
Nicos Vermeulen

Nicos Vermeulen

31/03/2020 15:06:27
Quote Anchor link
Rob Doemaarwat op 07/03/2020 13:37:49:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>

(wederom: garantie tot de deur)

Dank je Rob! Dit werkt!!!
Gewijzigd op 31/03/2020 15:06:44 door Nicos Vermeulen
 
Thomas van den Heuvel

Thomas van den Heuvel

31/03/2020 16:52:36
Quote Anchor link
@Ariën ik stelde ook een variant voor in een WYSIWYG-editor. Dat is dan mogelijk een dialoog met expliciete invulvakjes, veel gebruiksvriendelijker (noch explicieter, je selecteert EXACT wat jij als hyperlink wilt) wordt het niet?

@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?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<script>while (1) alert('irritant he?')</script>
Gewijzigd op 31/03/2020 16:57:08 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.