PHP/MySQL - Klickbara länkar mitt i text

Tråden skapades och har fått 8 svar. Det senaste inlägget skrevs .
1

Jag har gjort en "gästbok" i php/mysql och har en liten undring:

Om en besökare skriver en web-adress mitt i sitt meddelande, går det då att få den klickbar?

(Ja, jag vet, jag kan ha ett separat fält för det, men jag vill inte)

/sny

  • Medlem
  • Stockholm
  • 2003-02-21 08:23
Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">$message = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
"<a href="\0" target=_top>\0</a>", $message);
</pre>

Edit: la till en radbrytning för det blev en sån lång rad.

[ 21. februari 2003, 08:24: Meddelandet ändrat av: Linus ]

  • Medlem
  • Svedala
  • 2003-02-21 16:31

Har sett den där lösningen på php.net också tror jag... men skulle nån kunna förklara lite mer ingående hur det funkar?
Lyckas inte riktigt lista ut det, och det känns lite trist att använda funktioner utan att veta hur dom funkar.

  • Medlem
  • Stockholm
  • 2003-02-21 16:50

Jag har inte skrivit funktionen själv (är askass på regexps) men vad den gör är alltså att den söker efter något som liknar en länk. För att bestämma vad som är en länk eller inte måste man ge den lite kunskap om hur en sån ser ut, ett "regular expression".

ereg_replace är funktionen i php vi använder.
Regelverket är att vilka bokstäver som helst (:alpha:) ska följas av :// (ftp, http, nntp, news etc) som i sin tur ska följas av precis vad som helst tills den stöter på ett tomrum (mellanslag).

Med det har man tagit ut länken ur textmassan och ska genast sätta in den igen, fast denna gång länkad.

Vet inte om du blev något klokare iofs

Regular expressions är precis lika krångligt som det är kraftfullt. Eller om det var tvärtom...

Här är två länkar för den som vill grotta ner sig i ämnet:

Learning to Use Regular Expressions by Example

Regular Expressions

Jag använde det här:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;"> $meddelande = preg_replace("/((http(s?)://)|(www.))([S.]+)/i",
"<a href="http$3://$4$5"target="_blank">$2$4$5</a>", $meddelande);
</pre>

Funkar mkt bra...

/sny

edit: radbyte

[ 24. februari 2003, 20:02: Meddelandet ändrat av: snyltarn ]

  • Medlem
  • Stockholm
  • 2003-02-24 20:13

Det där var en perl-style regexp som det ser ut som, som php kan använda med preg_*.

Körde lite perl/cgi för några år sedan och fick hygglig koll (bortglömt naturligtvis). PHP´s känns lite udda

Citat:

citera:Skapades ursprungligen av: Linus:
Det där var en perl-style regexp som det ser ut som, som php kan använda med preg_*.

Körde lite perl/cgi för några år sedan och fick hygglig koll (bortglömt naturligtvis). PHP´s känns lite udda

Är det något av dessa två som är bättre än det andra? Om inte, varför finns det två?

/sny

  • Oregistrerad
  • 2003-02-26 15:16

Så länge olika personer skapar språk kommer det nog finnas olika versioner av gemensamma tekniker

Perls skapare Larry Wall håller på att forma om Perls regexp inför version 6 av språket, så fler varianter lär komma.

Det som dock verkar vara vanligast idag är Perl style regexp.

Vill man fånga både www.99mac.com-, www2.google.com-, http://slashdot.org- och file:///Users/kim/liten_fil.txt-adresser kan man använda följande:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">$meddelande = preg_replace("/([a-z]+://|w+d*.)([^s]{2,}/i",
"<a href="$1$2" target="_blank">$1$2</a>", $meddelande);</pre>

I Perl skulle samma kod se ut såhär:

Citat:

kod:<pre style="font-size:x-small; font-family: monospace;">$meddelande =~ s{([a-z]+://|w+d*.)([^s]{2,})}{<a href="$1$2" target="_blank">$1$2</a>}ig;</pre>

Den koden fångar dock inte com.apple.safari.en.liten.plista.plist, vilket innebär att adresser som inte börjar med www måste föregås av http:// för att fångas.

1
Bevaka tråden