webForumDet fria alternativet

Hitta länkar i sträng (revisited)

PHP

18 svar · 690 visningar · startad av Mungo

Medlem sedan jan. 2000372 inlägg
Frågan#1

Nu håller jag på att bli galen. Efter att ha suttit en hel eftermiddag och testat olika varianter av regexp för att hitta weblänkar och e-postadresser i en sträng har jag gett upp. Jag har helt enkelt inte hittat NÅN funktion som klarar allt som jag vill. Kanske nån härpå webforum har en att dela med sig av?

En vettig funktion ska ju klara allt detta:

www.algonet.se
http://www.algonet.se
http://www.algonet.se/\~test
http://www.algonet.se/\~test/folder
http://www.algonet.se/\~test/folder/
http://www.algonet.se/\~test/folder/sida.php
http://www.algonet.se/\~test/folder/sida.php?arg
http://www.algonet.se/\~test/folder/sida.php?arg=1
http://www.algonet.se/\~test/folder/sida.php?arg=1&arg2
http://www.algonet.se/\~test/folder/sida.php?arg=1&arg2=2
http://www.algonet.se/\~test/folder/sida.php?arg=1&arg2=2. (obs punkten eller varför inte komma?)

test@algonet.se
test.test@algonet.se
t_test.test@algonet.se
t_test.test@m.algonet.se
t_test.test@m.algonet.se. (obs punkten igen)

Sitter nån av er på ett riktigt benknäckartrick så tveka inte att dela med er till en frustrerad PHP-broder!

//Måns

PS) Efter att ha testat så visar det sig att webforums funktion klarar alla ovanstående utom den sista weblänken, dvs den med punkt på slutet. Men den klarar mailadress med punkt på slutet. Skumt? Hursomhelst, kan man få låna webforums funktion kanske? DS.

Medlem sedan jan. 2002414 inlägg
#2

varför skall den klara punkt i slutet????

på en webbadress kan man kanske förstå men i en epost adress så finns väl aldrig punkt på slutet?

Medlem sedan jan. 2000372 inlägg
#3

Folk...

Det kan ju knappast finnas punkt i slutet på en webadress heller men folk skriver ju sånt här:

Kom till min fina websida! Adressen är http://www.blabla.com.

Min e-postadress är blabla@blabla.com.

Så därför. Men är det ingen som har en funktion? :)

Trevlig midsommar!

Medlem sedan jan. 2002414 inlägg
#4

det skulle kunna vara en "." i slutet på en webbadress jo...
men varför vill du ha med den??? *fattar inte* men men...

eftersom den finns i Webforum så kolla källkoden för vBulletin var man nu hittar den

Medlem sedan jan. 2000372 inlägg
#5

Waaah :)

Jag vill INTE ha med den. Funktionen ska vara smart nog att fatta att:

http://www.algonet.se/\~test.

ska översättas till

<a href="http://www.algonet.se/\~test">http://www.algonet.se/\~test.\<a>

Jag visste inte att webforum var en generell mjukvara, tack för tipset - jag ska leta efter källkoden.

Medlem sedan maj 20001 953 inlägg
#6

webForum är inte generell mjukvara. Det (vBulletin) är en kommersiell applikation.

Medlem sedan jan. 2000372 inlägg
#7

Men alltså är det så att INGEN har en vettig funktion för detta ändamål att låna ut? Konstigt.

Medlem sedan maj 20003 652 inlägg
#8

Jag tror att https://www.flogs.org har en funktion som fungerar bra för ändamålet! (med reservation för ev. missar ang. krav för vad det ska klara i tidigare inlägg :))

R: Ops, sorry. Upptäckte att det inte fanns något dyl. skript där, hade för mig att det fanns ett där :l :r

Medlem sedan jan. 2000372 inlägg
#9

Tack för tipset, men jag kan bara hitta tre script där och inget av dem hanterar strängar -> URL:er.

Medlem sedan maj 20003 652 inlägg
#10

Kan dett avara någonting?

http://phpcoded.com/?DO=viewCode&ID=55

Medlem sedan jan. 2000372 inlägg
#11

Nej, den får jag inte att funka alls, returnerar en tom sträng?

Den bästa funktion jag har lyckats hitta hittills och som jag använt mig av tills jag ledsnade i torsdags är denna:

function strLinks($text) {
   $text = preg_replace("/\b((http(s?):\/\/)|(www\.))([\w\.]+)([\/\w+\.]+)\b/i","<a href=\"http$3://$4$5$6 \"target=\"_blank\">$2$4$5$6</a>", $text);
   $text = preg_replace("/([\w\.]+)(@)([\w\.]+)/i","<a href=\"mailto:$0\">$0</a>",$text);
   return $text;
   }

...men den känner bara igen "vanilj"-URL:er, dvs utan ~, ? och sånt.

Egentligen borde väl ett regexp vara såhär:

OM (börjar med http: ELLER www) SÅ ta sträng fram till första whitespace och ersätt med HTML-kod för länk.

Alltså, jag menar egentligen borde det väl vara ett rätt enkelt regexp? Bara det att jag är så jäkla usel på regexp. Skäms på mig. :)

Medlem sedan apr. 2002830 inlägg
#12

men om du använder dig av webforums kod å sedan bara tar bort det sista tecknet mha typ någon chop funktion (orkar inte kolla var det heter..) om det är en punkt...tills du hittar en funktion som passar....

Medlem sedan jan. 2000372 inlägg
#13

Jo, men jag har ju inte ens hittat webforums kod för detta!

Medlem sedan apr. 2002830 inlägg
#14

Då blev det ju lite svårare... testa denna funktion, vet inte hur den funkar med punkter på slutet dock :(

function linkText($text)
{
	$text = preg_replace("/((http(s?):\/\/)|(www\.))([\w\.\\:\\?\\~\\=\\&\-_\/]+)/i","<a href=\"http$3://$4$5\" target=\"_blank\"><u>$2$4$5</u></a>",$text); 
	$text = preg_replace("/([\w\.\-_]+)(@)([\w\.\-_]+)/i", "<a href=\"mailto:$0\"><u>$0</u></a>",$text); 
	
	return $text;
}

//Nippe

Medlem sedan jan. 2000372 inlägg
#15

Ah, yes! Först funkade den inte, men efter att ha fipplat lite med några backslashar så funkar den prima!!! (förutom punkten på slutet, men den kan man ju filtrera bort separat)

TUSEN TACK!!! Du har räddad mig från ett öde värre än döden (nämligen att på egen hand försöka lära mig regexp från scratch...)

Här är funktionen som den blev till slut: Borde kanske läggas in i wfKodexempel eller vad forumet nu heter?

function strLinks($text)
{
    $text = preg_replace("/((http(s?):\\/\\/)|(www\\.))([\w\\.:?~=&\\-_\\/]+)/i","<a href=\"http$3://$4$5\" target=\"_blank\"><u>$2$4$5</u></a>",$text); 
    $text = preg_replace("/([w.-_]+)(@)([w.-_]+)/i", "<a href=\"mailto:$0\"><u>$0</u></a>",$text); 
    
    return $text;
}
Medlem sedan jan. 2000372 inlägg
#16

Jahaja, nu såg jag att det var ju troligen inte ditt fel utan webforum som av nån anledning går in i PHP-kod och rensar bort backslashar! Varför det? Hursomhelst, efter att ha postat om med dubbla backslashar "\\" funkar det ju. Tack igen!

Medlem sedan apr. 2002830 inlägg
#17

Hm, mycket konsigt! Jag har fått ovanstående kod att fungera förut, nu vill den inte alls: http://www.aftonbladet.se länkar bara upp http://www. och inte resten. Någon som vet varför?

// Nippe

Medlem sedan apr. 2002830 inlägg
#18

Hittade följande kod på php.net

function strLinks($text)
{
	$search = array("/(?<!quot;|[=\"]|:\/{2})\b((\w+:\/{2}|www\.).+?)"."(?=\W*([<>\s]|$))/i", "/\b(^| )([\w\.]+)(@)([\w\.-]+)\b/i");
	$replace = array("<a href=\"$1\" target=\"_blank\">$1</a>", "<a href=\"mailto:$0\">$0</a>");

	return preg_replace("/href=\"www/i", "href=\"http://www", preg_replace ($search, $replace, $text));
}

Den funkar med alla länkar som Mungo angivit ovan, dock inte epostlänkarna, men det behövde inte jag ;)

[EDIT]: Upptäkte att den inte klarade http://www.algonet.se/~test/folder/ ska se om jag kan lösa det!

// Nippe

Medlem sedan jan. 200398 inlägg
#19

Re: Folk...

Mungo skrev:

Det kan ju knappast finnas punkt i slutet på en webadress heller men folk skriver ju sånt här:

Kom till min fina websida! Adressen är http://www.blabla.com.

Min e-postadress är blabla@blabla.com.

Så därför. Men är det ingen som har en funktion? :)

Trevlig midsommar!

Ovanstående adresser är faktiskt giltiga. Prova att skriva in t ex "www.dn.se." i en browser (utan citationstecken förstås). Om du inte inser varför så får du läsa på om dns-systemet ;-)

257 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)