Quotes en <br /> tags excluderen in regular expression, hoe?
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)
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
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));
$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. :)
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
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
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.
Maar mijn probleem is dus om meerdere links in één tekstveld om te zetten met bovenstaande regular expressions.
En zou je misschien <?php en ?> om je code willen zetten, dan kunnen we het makkelijker lezen.
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