Quotes en <br /> tags excluderen in regular expression, hoe?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Xaboteur X

Xaboteur X

17/03/2012 14:27:30
Quote Anchor link
Hallo allemaal,

Ik probeer getypte en gekopieerde links in posts om te zetten naar html links, maar het lukt mij maar niet om quotes en <br />'s te excluderen in de expressie.

De mogelijkheden zijn als volgt (zie 3 expressies):
- http://google.com
- www.google.com
- google.com

Echter worden de links in de gevormde href="" attributen ook nog eens omgezet, wat dus niet de bedoeling is. Daarom dat ik quotes wil excluderen.
En bij een opsomming van links, waar na elke link een enter komt, mag hij dus ook geen <br />'s toelaten.

Dit is mijn code tot dusver, die dus het voorgaande allemaal fout doet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
            // The Regular Expression filter
            $reg_exUrl1 = "/(?!\")(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?(?!\")(?!<br>)/";
            $reg_exUrl2 = "/(?!\")(www)\.[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?(?!\")(?!<br>)/";
            $reg_exUrl3 = "/(?!\")([a-zA-Z0-9\-\.])+\.[a-zA-Z]{2,3}(\/\S*)?(?!\")(?!<br>)/";
            
            // The Text you want to filter for urls
            $message = strip_tags(nl2br(trim($_POST['chat-message'])), "<br><a>");
            
            // Check if there is a url in the text
            if(preg_match($reg_exUrl1, $message, $url)) {
                // http://
                $message = preg_replace($reg_exUrl1, '<a target="_blank" href="'.$url[0].'">'.$url[0].'</a>', $message);
            }
            if(preg_match($reg_exUrl2, $message, $url)) {
                // www
                $url1 = 'http://'.$url[0];
                $url2 = $url[0];
                $message = preg_replace($reg_exUrl2, '<a target="_blank" href="'.$url1.'">'.$url2.'</a>', $message);
            }
            if(preg_match($reg_exUrl3, $message, $url)) {
                // zonder http:// of www
                $url1 = 'http://'.$url[0];
                $url2 = $url[0];
                $message = preg_replace($reg_exUrl3, '<a target="_blank" href="'.$url1.'">'.$url2.'</a>', $message);
            }
            
            $message = mysql_real_escape_string(stripslashes($message));


Graag even wat toelichting aub. :)
 
PHP hulp

PHP hulp

25/04/2024 22:15:30
 
Kris Peeters

Kris Peeters

19/03/2012 17:12:02
Quote Anchor link
Zoiets moet je vermijden.

strip_tags en nl2br (ook htmlentities) zijn functies die je gebruikt na het lezen van de DB (SELECT query), niet bij het schrijven (INSERT / UPDATE).

Het is not done om de post van een gebruiker aan te passen vooraleer je ze INSERT.

Neem als voorbeeld deze site, hier.
Als jij op de knop "Wijzigen" drukt, zal je in de textarea de tekst zien exact zoals je ze gepost hebt; en zo hoort het.
De gebruiker zou het vreemd vinden mocht hij opeens <br/> tekens zien, mocht de helft van zijn tekst verdwenen zijn, de hyper links aangepast, ...
Gewijzigd op 19/03/2012 17:14:18 door Kris Peeters
 
Xaboteur X

Xaboteur X

20/03/2012 02:38:13
Quote Anchor link
Bedankt Kris.
Maar het is gewoon de bedoeling om ingevoerde links automatisch om te zetten naar html links.
Het dient niet voor een forum, maar voor een klein chat-systeempje, dus het is niet zo enorm delicaat.

In mijn eerste post worden de links ook automatisch omgezet. :)
Gewijzigd op 20/03/2012 02:38:50 door Xaboteur X
 
Wouter J

Wouter J

20/03/2012 08:51:33
Quote Anchor link
Xaboteur, Kris bedoelt dat je dit soort dingen bij het eruit halen moet doen en niet ervoor. Dus als je ze INSERT in de database verander je niks, maar pas bij het eruit halen ga je deze functies eroverheen gooien.
 
Xaboteur X

Xaboteur X

20/03/2012 22:14:10
Quote Anchor link
Dat weet ik Wouter. :)
Maar mijn probleem is dus om meerdere links in één tekstveld om te zetten met bovenstaande regular expressions.
 
Wouter J

Wouter J

20/03/2012 22:34:06
Quote Anchor link
Xaboteur, Kris en ik zeggen het alleen omdat jou code zoals je die nu hebt (met eerst aanpassen data en dan mysql_real_escape_string eromheen (dit gebruik je alleen als je tekst geen inserten)) suggereert het omgekeerd te doen.

En zou je misschien <?php en ?> om je code willen zetten, dan kunnen we het makkelijker lezen.
 
Kris Peeters

Kris Peeters

20/03/2012 23:14:38
Quote Anchor link
Het is trouwens een groot deel van het probleem waar je mee zit.

Wanneer je de data van de gebruiker zuiver opslaat, kan je ook veel gemakkelijker de data manipuleren.

Anders riskeer je ook dat je dingen dubbel doet; functies als htmlentities, voor of na dat je al nl2br hebt gebruikt; tags wil strippen ... Dit geeft foute resultaten.
Het wordt niet meer overzichtelijk welke filter er waar al gebruikt is.

Data zuiver opslaan. Enkel escapen.

Filteren bij het lezen van de data, van de database.
Gewijzigd op 20/03/2012 23:15:39 door Kris Peeters
 



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.