Avatar billede spectre Nybegynder
21. november 2005 - 15:30 Der er 14 kommentarer

URL-håndtering i PHP preg_replace

hej alle

jeg har et mindre hjemmelavet forum i php, hvor brugerne indtil nu har kunnet lave links ved at skrive fx [link http://www.google.dk]www.google.dk[/link] og et par andre syntax'er (se lidt længere nede for kildekode).

Nu vil jeg gerne lave det sådan så man både kan bruge [link] eller [url]-tagget samtidig med at der er en regex, der opsamler alle URL's, der IKKE er i et af disse tags.

håber jeg har forklaret spørgsmålet korrekt. Spørg endelig hvis I er i tvivl.

PHP Kildekode:

function func($input) {
    $result = htmlspecialchars($input);

    $result = preg_replace("/\[[Ll][Ii][Nn][Kk][\s=](.*?)\](.*?)\[\/[Ll][Ii][Nn][Kk]\]/", "<a href=\"\\1\" target=\"_new\">\\2</a>", $result);
    $result = preg_replace("/\[[Ll][Ii][Nn][Kk]\](.*?)\[\/[Ll][Ii][Nn][Kk]\]/", "<a href=\"\\1\" target=\"_new\">\\1</a>", $result);

    $result = preg_replace("/\[[Uu][Rr][Ll][\s=](.*?)\](.*?)\[\/[Uu][Rr][Ll]\]/", "<a href=\"\\1\" target=\"_new\">\\2</a>", $result);
    $result = preg_replace("/\[[Uu][Rr][Ll]\](.*?)\[\/[Uu][Rr][Ll]\]/", "<a href=\"\\1\" target=\"_new\">\\1</a>", $result);

    return nl2br($result);
}

mvh
Avatar billede nielle Nybegynder
21. november 2005 - 15:39 #1
Blot en bemærkning:

Prøv at rette done udtryk af denne form:

$result = preg_replace("/\[[Ll][Ii][Nn][Kk][\s=](.*?)\](.*?)\[\/[Ll][Ii][Nn][Kk]\]/", "<a href=\"\\1\" target=\"_new\">\\2</a>", $result);

- til dette:

$result = preg_replace("/\[link[\s=](.*?)\](.*?)\[\/link]\]/i", "<a href=\"\\1\" target=\"_new\">\\2</a>", $result);

Det lille /i i afslutningen af dit mønster gør at den ikke skelner forskel på store og små bogstaver.
Avatar billede Slettet bruger
21. november 2005 - 15:39 #2
Kunne du ikke bruge "i" option så den er case-insensitiv, så er det nok lidt lettere at læse og hjælpe....

/\[link[\s=](.*?)\](.*?)\[\/link\]/i
Avatar billede spectre Nybegynder
21. november 2005 - 15:42 #3
funktion edited:

function func($input) {
    $result = htmlspecialchars($input);

    $result = preg_replace("/\[link[\s=](.*?)\](.*?)\[\/link\]/i", "<a href=\"\\1\" target=\"_new\">\\2</a>", $result);
    $result = preg_replace("/\[link\](.*?)\[\/link\]/i", "<a href=\"\\1\" target=\"_new\">\\1</a>", $result);

    $result = preg_replace("/\[url[\s=](.*?)\](.*?)\[\/url\]/i", "<a href=\"\\1\" target=\"_new\">\\2</a>", $result);
    $result = preg_replace("/\[url\](.*?)\[\/url\]/i", "<a href=\"\\1\" target=\"_new\">\\1</a>", $result);

    return nl2br($result);
}
Avatar billede Slettet bruger
21. november 2005 - 15:48 #4
Hvordan vil du identificere et URL

Du kunne overveje

/http://(\S)+/i

men der er jo muligheder nok...
Avatar billede nielle Nybegynder
21. november 2005 - 15:53 #5
... plus at URL'et jo også kan have en <a href=" ... "> ... </a> rundet om sig.

Endeligt er der også mulighederne for at have ftp: og mailto: i stedet for http:
Avatar billede spectre Nybegynder
21. november 2005 - 15:55 #6
har fundet følgende preg_replace hos php.net til at identificere URL:

$result = preg_replace( "`((http)+(s)?:(//)|(www\.))((\w|\.|\-|_)+)(/)?(\S+)?`i", "<a href=\"http\\3://\\5\\6\\8\\9\" title=\"\\0\">\\5\\6</a>", $result);

jeg tænkte på om det kunne være noget med at sætte denne kodelinje over de fire andre preg_replace's, og så tjekke om de(n) URL(s), der findes, starter med f.eks. [link=http.... eller [url]http:...

men hvordan det gøres i regex, er mit spørgsmål til jer :)
Avatar billede spectre Nybegynder
21. november 2005 - 15:56 #7
nielle: man kan i forummet ikke lave HTML-links eller nogen HTML-tags for den sags skyld

$result = htmlspecialchars($result);

:)
Avatar billede nielle Nybegynder
21. november 2005 - 17:38 #8
Hvis der er noget url-lignende i din tekst, og det ikke er pænt indpakket i enten en [link]- eller en [url]-blok, hvad skal der så ske med det? Skal det laves om til et url eller hvad?
Avatar billede spectre Nybegynder
21. november 2005 - 17:39 #9
lige præcis :) og det er der at mine regex-evner kommer til kort
Avatar billede nielle Nybegynder
21. november 2005 - 18:17 #10
Hmmm, jeg synes godt nok at du er large af dig; Du tillader at folk skriver:

[link=http://www.eksperten.dk]Eksperten[/link]
[link]http://www.eksperten.dk[/link]

- eller:

[url http://www.eksperten.dk]Eksperten[/url]
[url]http://www.eksperten.dk[/url]

- og så vil du også tillade at de bare skriver:

http://www.eksperten.dk

?

Hvorfor tillader du så ikke bare at de simpelthen må skrive url's til at starte med? Det ville da være langt det nemmeste. :^)
Avatar billede spectre Nybegynder
22. november 2005 - 14:10 #11
det er bare fordi at folk allerede har fyldt adskillige forums med de 'gamle' links - og folk hader jo forandring :)

desuden er det rart at kunne give et link et navn, hvis man vil det istedet for at vise url'enn
Avatar billede nielle Nybegynder
22. november 2005 - 18:56 #12
Et muligt bud:

function func($input)
{
    $result = htmlspecialchars($input);

    $result = preg_replace("/\[link[\s=](.*?)\](.*?)\[\/link\]/i", "<a href=\"\\1\" target=\"_new\">\\2</a>", $result);
    $result = preg_replace("/\[link\](.*?)\[\/link\]/i", "<a href=\"\\1\" target=\"_new\">\\1</a>", $result);

    $result = preg_replace("/\[url[\s=](.*?)\](.*?)\[\/url\]/i", "<a href=\"\\1\" target=\"_new\">\\2</a>", $result);
    $result = preg_replace("/\[url\](.*?)\[\/url\]/i", "<a href=\"\\1\" target=\"_new\">\\1</a>", $result);

    $return = preg_replace("!\s((https?|ftp)://\S+)\s!i", " <a href=\"\\1\" target=\"_new\">\\1</a> ", $result);
    $return = preg_replace("!\s(www.\S+)\s!i", " <a href=\"\\1\" target=\"_new\">\\1</a> ", $result);

    return nl2br($result);
}
Avatar billede nielle Nybegynder
29. november 2005 - 21:22 #13
Har du fået kigget på det?
Avatar billede nielle Nybegynder
08. december 2005 - 22:40 #14
??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester