Just nu i M3-nätverket
Jump to content

Söka efter länkar i en text?


HalSoul

Recommended Posts

 

Jag funderar lite på hur man söker efter länker i en text.

Exempel är ju alla forum, skriver man ut en hel länk med http:// så blir det en länk när den väl är postad i forumet.

 

Hur funkar detta?

 

Jag har sett det i ASP men inte i PHP...

 

 

/ Josefsson

"Gör aldrig mer än vad du behöver, fundera dock på vad du behöver göra"

 

Link to comment
Share on other sites

I båda fallen så löser man det nog bäst med regexp (regular expressions).

Sök runt lite här på eforum och google (eller annan sökmotor) så kommer du nog hitta en näve exempel.

 

[edit:]tex

//eforum.idg.se/viewmsg.asp?EntriesId=514361

//eforum.idg.se/viewmsg.asp?EntriesId=283050

 

/Cluster

------------------------------------------------------

"Den som försummar att dricka ur erfarenhetens källa

kommer troligen att dö av törst i okunnighetens öken."

------> http://eforum.kicks-ass.net <------

 

[inlägget ändrat 2005-05-24 00:12:08 av Cluster]

Link to comment
Share on other sites

Tyvärr är jag inte high på regexp så jag fattar mer eller mindre nada av vad de kommer fram till på de andra sidorna...

 

Jag har googlat lite och gått igenom forum koder, men kan inte sätta fingret på hur det går till, jag har ett hum, men inte riktigt satt huvudet på spiken.

 

Min kod just nu:

 

<?[color="#0000ff"]php[/color] 

$text = "Detta är en länk: http:[color="#006400"]//www.kapsyl.org och sidan är värd att besökas!";[/color]

convert_links($text);

[color="#0000ff"]function[/color] convert_links($str) {
$replace = "<a href=\"" . [color="#ff0000"]htmlentities[/color]('\\1') . [color="#ff0000"]htmlentities[/color]('\\2') . "\">" . [color="#ff0000"]htmlentities[/color]("\\1") . [color="#ff0000"]htmlentities[/color]("\\2") . "</a>";
$str	= [color="#ff0000"]preg_replace[/color]("^(http:[color="#006400"]//)([^\s]*)$", $replace, $str);[/color]
[color="#0000ff"]return[/color] $str;
}

?>

 

får fel på preg_replace() funktionen. den säger att '\' är ogilltigt.. skummt enligt mig eftersom '\s' står för mellanslag...

 

/ Josefsson

"Gör aldrig mer än vad du behöver, fundera dock på vad du behöver göra"

 

[inlägget ändrat 2005-05-24 01:38:45 av Josefsson]

[inlägget ändrat 2005-05-24 01:41:16 av Josefsson]

Link to comment
Share on other sites

Ett regexp-pattern ska för det första stå mellan två avskiljare som talar om var det startar och slutar, alltså t.ex så här:

[color="#ff0000"]preg_replace[/color]("[color="#0000ff"]@[/color]^(http:[color="#006400"]//)([^\s]*)$@", $replace, $str);[/color]

(avskiljarna kan vara vad som helst, huvudsaken är att de är identiska, det är bra att välja något man inte försöker maska på).

 

Vidare så har du satt allt inom citations-tecken, då kommer php att försöka hantera strängen först. Eftersom \ är ett "escape"-tecken i en sådan sträng så innebär det att \ aldrig skickas med i ditt pattern. Det finns två alternativ för att lösa det:

Alt. 1

[color="#ff0000"]preg_replace[/color]("[color="#0000ff"]@[/color]^(http:[color="#006400"]//)([^\\s]*)$@", $replace, $str);[/color]

\\ talar om för php att du verkligen menar \ och inte escape+s

 

Alt.2

[color="#ff0000"]preg_replace[/color]('[color="#0000ff"]@[/color]^(http:[color="#006400"]//)([^\s]*)$@', $replace, $str);[/color]

Med "enkelfnuttar" runt strängen gör inte php någon speciell hantering av strängen utan skickar den precis som den är, rakt in till preg_replace().

 

Har inte tittat på din regexp i övrigt, den fungerar säkert hyffsat. Om du tittar på //eforum.idg.se/viewmsg.asp?EntriesId=710053#710270 så ser du en lite annorlunda variant som fungerar bra.

 

 

Link to comment
Share on other sites

function makeClickable($txt){

return preg_replace( "/(?<!<a href=\")((http|ftp)+(s)?:\/\/[^<>\s]+)/i", "<a href=\"\\0\" TARGET=_blank>\\0</a>", $txt );

}

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...