webForumDet fria alternativet

Länkar och reg-uttryck

15 svar · 403 visningar · startad av Swey

SweyMedlem sedan apr. 20003 971 inlägg
#1

Jag hittade dessa uttryck för att hantera länkar med reguljära uttryck.

Vad gör de och hur man gör för att de ska fungera?

$body = eregi_replace("<(mailto:)([^ >\n\t]+)>", "{phopen}a href=\"\\1\\2\"{phclose}\\2{phopen}/a{phclose}", $body);
$body = eregi_replace("<([http|news|ftp]+://[^ >\n\t]+)>", "{phopen}a href=\"\\1\"{phclose}\\1{phopen}/a{phclose}", $body);

------------------
/mvh Swey
Programmera PHP

sgtpepperMedlem sedan apr. 20007 588 inlägg
#2

Dom ser lite konstiga ut tycker jag, det kräver att man skriver länkarna inom < > för att det ska funka och det ska man ju inte behöva. Sen vet jag inte riktigt varför {phclose} och {phopen} behövs, vanliga < och > funkar för mig. Testa:

$body1 = eregi_replace("(mailto:)([^ >\n\t]+)", "<a href=\"\\1\\2\">\\2</a>", $body);
$body2 = eregi_replace("([http|news|ftp]+://[^ >\n\t]+)", "<a href=\"\\1\">\\1</a>", $body);

Gör om mailto:namn@server.se och http://www.server.se till länkar (inkl ftp och news).

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

1010011010 - The binary number of the beast

SweyMedlem sedan apr. 20003 971 inlägg
#3

Hittade det där i Phorum som är forum för PHP med PostgreSQL och mySQL. Tyckte också det var lite konstigt.

Men nu fungerar det utmärkt. Tack!

------------------
/mvh Swey
Programmera PHP

SweyMedlem sedan apr. 20003 971 inlägg
#4

Hm... problem...

Det som du postade gör att länkarna inkluderar tecknet efteråt

det blir alltså så här
<a href="url ">url </a>
eller så här
<a href="url
">url
</a>

Lösning?

------------------
/mvh Swey
Programmera PHP

sgtpepperMedlem sedan apr. 20007 588 inlägg
#5

Testa och lägg in \r i ^-listan:

eregi_replace("(mailto:)([^ >\n\t**\r**]+)", "<a href=\"\\1\\2\">\\2</a>", $body);
eregi_replace("([http|news|ftp]+://[^ >\n\t**\r**]+)", "<a href=\"\\1\">\\1</a>", $body1);

Det borde lösa radmatningen (gör det för mig iaf). Att mellanslaget tas med är konstigt, för den finns ju redan med i ^-listan. Kör du under Windows?

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

1010011010 - The binary number of the beast

SweyMedlem sedan apr. 20003 971 inlägg
#6

Linux på servern och Windows som klient. Kör iofs. hemma också.

Det verkar ha löst sig nu. Vet inte riktigt vad det första berodde på.

Tack :)

------------------
/mvh Swey
Programmera PHP

spangoMedlem sedan juni 20008 205 inlägg
#7

varför ha
([^ >\n\t\r]+)
när man kan ha
(\S+)
i stället?

------------------
-- spango
Släpp fram mig, jag är webbdesigner!

SweyMedlem sedan apr. 20003 971 inlägg
#8

Hur menar du?

------------------
/mvh Swey
Programmera PHP

SweyMedlem sedan apr. 20003 971 inlägg
#9

Förklara. Får inte \S att fungera. Vad gör den?

Tack :)

------------------
/mvh Swey
Programmera PHP

nicclasMedlem sedan feb. 20001 050 inlägg
#10

Från http://www.devshed.com/Server_Side/Administration/RegExp/page3.html :

\S = used to match everything that is *not* a white space character

/nicclas @ http://www.allanyheter.com

SweyMedlem sedan apr. 20003 971 inlägg
#11

aha... får labba lite...

Jag vill lägga till en kriterie. Om länken slutar med en punkt ska inte punkten ingå i länken. Men punkter ska kunna ingå i länken om den inte slutar på den. Den ska alltså sluta när den stöter på punkt och whitespace(?).

------------------
 - Swey
Projekt wF PHP

[Redigerat av Swey den 13 jul 2000]

nicclasMedlem sedan feb. 20001 050 inlägg
#12

Enkelt, fult och långsamt, men det funkar :) :

<?
$body="Matti har [url="http://www.nic-sys.se/\n"]http://www.nic-sys.se/\n[/url]  som startsida! Clas har tröttnat på [url="http://www.nic-sys.se."]http://www.nic-sys.se.[/url]  Nicclas tycker att [url="http://www.allanyheter.com"]http://www.allanyheter.com[/url]  är coolare!\n\n";

$body = eregi_replace("(mailto:)([^ >\n\t\r]+)", "<a href=\"\\1\\2\">\\2</a>", $body);
$body = eregi_replace("([http|news|ftp]+://([^ \n\r\t]+))\. ", "<a href=\"\\1\">\\1</a>. ", $body);
$body = eregi_replace("([http|news|ftp]+://([^ \n\r\t]+))", "<a href=\"\\1\">\\1</a>", $body);

echo $body;

?>

/nicclas http://www.nic-sys.se/

[Redigerat av nicclas den 15 jul 2000]

SweyMedlem sedan apr. 20003 971 inlägg
#13

Tack, skkulle man kunna få in båda de sista i ett uttryck?

Sen fungerar inte \\S för mig. Det söker efter tecknet S.

------------------
 - Swey
Projekt wF PHP

[Redigerat av Swey den 15 jul 2000]

nicclasMedlem sedan feb. 20001 050 inlägg
#14

Ooops... \S verkar bara fungera i Perl-versionen av r.u.'s. Men eftersom PHP även har stöd för Perl-versionen :) så funkar

<?
$body="Matti har [url="http://www.nic-sys.se/\n"]http://www.nic-sys.se/\n[/url]  som startsida! Clas har tröttnat på [url="http://www.nic-sys.se."]http://www.nic-sys.se.[/url]  Nicclas tycker att [url="http://www.allanyheter.com"]http://www.allanyheter.com[/url]  är coolare!\n\n";
$body=preg_replace("/([http|news|ftp]+:\/\/[\S]+)/", "<a href=\"\\1\">\\1</a>", $body);
echo $body;
?>

/nicclas
Blir det några nyheter, eller?

SweyMedlem sedan apr. 20003 971 inlägg
#15

Det fungerar man du glömde punkten ;)

------------------
 - Swey
Projekt wF PHP

nicclasMedlem sedan feb. 20001 050 inlägg
#16

Jo, jag vet, det var med flit. Lösningen med .-en var ju inte så bra... Här fokuserar vi på ett problem i taget.
:)
/nicclas http://www.nic-sys.se

136 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)