tojaMedlem sedan mars 2001218 inlägg Hittade denna kod i skriptarkivet:
function strLinks($text) {
$text = preg_replace('%(<a\s[^>]+>http://[^\s]+</a>)|(<[^>]+http://[^>]+>)|(http://)[^\s]+%ie',
'"$0"=="$1" || "$0"=="$2" ? "$0" : "<a target=\"_blank\" href=\"$0\">$0</a>"', $text);
$text = preg_replace("/([w.-_]+)(@)([w.-_]+)(\.)([w.-_]+)/i", "<a href=\"mailto:$0\">$0</a>",$text);
$text = preg_replace('%(<a\s[^>]+>http://|www.[^\s]+</a>)|(<[^>]+www.[^>]+>)|(www.)[^\s]+%ie',
'"$0"=="$1" || "$0"=="$2" ? "$0" : "<a target=\"_blank\" href=\"http://$0\">$0</a>"', $text);
return $text;
}
Där skrev Mungo:
Denna funktion hittar allt som börjar med "www." och "http://", eller som är en giltig e-postadress och länkar upp det. Den är dock smart nog att ignorera det som ligger inom HTML-taggar!
Märkte efter tester dock att den inte är 100% felfri.
Det skiter sig vid detta:
$text = "<a href=\"mailto:toja@stambokaj.se\">Maila mig</a>";
$text = strLinks($text);
I detta så ignorerar den inte det som ligger inom HTML-taggar, fast det fungerar fint om det är en vanlig http eller www adress..!!
Någon som vet lösningen...?!!
tojaMedlem sedan mars 2001218 inlägg Ingen... Mungo kanske..?!
tojaMedlem sedan mars 2001218 inlägg Verkar som att den fungerar på detta sätt nu:
1. detta är en giltig epost, toja@stambokaj.se
2. detta är en giltig epost, mailto:toja@stambokaj.se
Alltså blir detta:
<a href="mailto:toja@stambokaj.se">Maila mig</a>
så här:
<a href="<a href=\"mailto:mailto:toja@stambokaj.se\">mailto:toja@stambokaj.se</a>">Maila mig</a>
Någon som kan lösa detta problem... eller är alla på hela forumet lika "lost" som mig på detta??
got it
fullösning.
vi utgår från att alla e-postadresser måste föregås av ett mellanslag eller en radbrytning.
tjoho,
function strLinks($text) {
$text = preg_replace('%(<a\s[^>]+>http://[^\s]+</a>)|(<[^>]+http://[^>]+>)|(http://)[^\s]+%ie','"$0"=="$1" || "$0"=="$2" ? "$0" : "<a target=\"_blank\" href=\"$0\">$0</a>"', $text);
$text = preg_replace("/(\s[w.-_]+)(@)([w.-_]+)(\.)([w.-_]+)/i", "<a href=\"mailto:$0\">$0</a>",$text);
$text = preg_replace('%(<a\s[^>]+>http://|www.[^\s]+</a>)|(<[^>]+www.[^>]+>)|(www.)[^\s]+%ie','"$0"=="$1" || "$0"=="$2" ? "$0" : "<a target=\"_blank\" href=\"http://$0\">$0</a>"', $text);
return $text;
}
//hampus brynolf
tojaMedlem sedan mars 2001218 inlägg Hmm... Hampus skript fungera inte heller riktigt rätt!
nu genererar den så här:
<a href="mailto:<br />toja@stambokaj.se"><br />
alltså fungerar det nästan... men kan man få den att skriva ut utan <br /> ??!
hur fungerar $0 ..?! kan man ange vilket som ska vara i den..?!
tja, det beror ju på vad du skickar in... jag utgick från ditt exempel:
$text = "<a href=\"mailto:toja@stambokaj.se\">Maila mig</a>";
$text = strLinks($text);
output:
<a href="mailto:toja@stambokaj.se">Maila mig</a>
Det blir inga fel.... inga <br>.
$0 refererar tillbaks till matchningen som görs i preg_replace.
//h
tojaMedlem sedan mars 2001218 inlägg hmm... kanske beror på att jag har en nl2br funktion precis efter...??
$text = "<a href=\"mailto:toja@stambokaj.se\">Maila mig</a>";
$text = strLinks($text);
$text = nl2br($text);
men tycker endå det verkar konstigt.. ska kolla det där!
vet ej. blir inget fel här - funkar precis som det ska - även med nl2br. Det finns ju inga radbrytningar med i $text.
Men om det skulle finnas med radbrytningar i $text, så kommer de förstås att konverteras till <br>...
//h
nkrantzMedlem sedan apr. 2002830 inlägg Testa köra nl2br innan du kör strLinks...
// Nippe
yesss. du har så rätt så. fixat (men inte buggfritt). ska man göra det här på rätt sätt är det ett gigantiskt jobb - vi måste bla kontrollera om vi befinner oss inne i en lång tag (en a som sträcker sig över flera rader), etc. För att inte tala om hur man ska hantera felformaterade html-dokument...
nåja; det här borde lösa dina flesta problem:
<?
$text = <<<EOL
toja@stambokaj.se FUNKAR
toja@stambokaj.se FUNKAR
asd.asd@sdasd.sdad.se FUNKAR
a@b.se FUNKAR
<a href="mailto:toja@test.se">sads</a> FUNKAR
<a href="mailto:
toja@test.se">sads</a> FUNKAR INTE
toja@
test.se FUNKAR INTE
EOL;
$text = strLinks($text);
$text = nl2br($text);
echo $text;
function strLinks($text) {
$text = preg_replace('%(<a\s[^>]+>http://[^\s]+</a>)|(<[^>]+http://[^>]+>)|(http://)[^\s]+%ie','"$0"=="$1" || "$0"=="$2" ? "$0" : "<a target=\"_blank\" href=\"$0\">$0</a>"', $text);
$text = preg_replace("/\s([w.-_]+)(@)([w.-_]+\.[w.-_]+)/im", "<a href=\"mailto:$1$2$3\">$1$2$3</a>",$text);
$text = preg_replace('%(<a\s[^>]+>http://|www.[^\s]+</a>)|(<[^>]+www.[^>]+>)|(www.)[^\s]+%ie','"$0"=="$1" || "$0"=="$2" ? "$0" : "<a target=\"_blank\" href=\"http://$0\">$0</a>"', $text);
return $text;
}
?>
tojaMedlem sedan mars 2001218 inlägg Toppen Hampus, du fixa det!
Jag är nöjd med resultatet, men tänker inte acceptera svaret som slutgiltigt...
För jag tror att det går att lösa smidigare, genom att på något sätt göra som de andra, där man kollar om länken omsluts av html-taggar... jag har provat mig fram men fattar inte riktigt hur det fungerar.. men någon kanske vet!??
allt går :)
ett problem med att matcha e-postadresser är att man förr eller senare börjar matcha saker som inte är e-postadresser...
om detta ska betraktas som en e-postadress:
test.
test@
dummymail.
com
ja, där är det rätt mycket som inte är adresser som kommer att tolkas som det. det förbättring som jag ser man kan göra i regexpen är att kontrollera att man verkligen inte är inuti en tag. men då kommer frågan hur vi hanterar följande scenario:
<<BACKA.
pelle@pelikan.se heter jag och jag gick från hit > dit
inte för att det är korrekt (html)kod, men för att illustrera problemet med var taggar börjar och slutar i verkligheten...
men visst går det att göra smidigare!
mer info för hur regexpar fungerar hittar du på:
http://se2.php.net/preg_replace
http://se2.php.net/manual/en/reference.pcre.pattern.syntax.php
http://se2.php.net/manual/en/reference.pcre.pattern.modifiers.php
//hampus
tojaMedlem sedan mars 2001218 inlägg Jag ger mig, tummen upp för dig Hampus! Jag fick ju den hjälp jag sökte i alla fall!