PDA

Bekijk Volledige Versie : [php] regexp



Jonathan
04/02/03, 14:35
Hoi,

ik heb mbv zoeken op google de volgende functie in PHP gemaakt die een
string als input neemt en als output dezelfde string geeft maar dan
eventuele urls uitgebreid heeft met een html link. Voorbeeld: 'Dit is de
link http://www.test.com' wordt omgezet naar: 'Dit is de link <a
href=http://www.test.com target="_blank">http://www.test.com</a>'.

function text2url($string)
{
$string =
preg_replace("((http://|ftp://)?([a-zA-Z1-9\-_\.]+\.[a-zA-Z1-9\-_]+\.[a-z]{2
,3}(/[a-z\-/\._\?=&]+)?))", "<a href=\"\\1\\2\" target=\"_blank\">\\0</a>",
$string);
$string =
preg_replace("((href=\")([a-zA-Z1-9\-_\.]+\.[a-zA-Z1-9\-_]+\.[a-z]{2,3}(/[a-
z\-/\._\?=&]+)?))", "href=\"http://\\2", $string);
return($string);
}

Maar gaat het vaak mis als de url ook nog een querystring heeft.
Bijvoorbeeld:

http://www.test.com/test.php?forum=30&topic=88

levert uiteindelijke een linkje op naar

http://www.test.com/test.php?forum=

Waarom gaat dit niet goed?

Alvast bedankt!

Groeten,
Jonathan

Ronald Paul
04/02/03, 15:45
"Jonathan" <jonathan@nospam-tricolon.com> schreef:

>function text2url($string)
>{
> $string =
>preg_replace("((http://|ftp://)?([a-zA-Z1-9\-_\.]+\.[a-zA-Z1-9\-_]+\.[a-z]{2
>,3}(/[a-z\-/\._\?=&]+)?))", "<a href=\"\\1\\2\" target=\"_blank\">\\0</a>",
>$string);
> $string =
>preg_replace("((href=\")([a-zA-Z1-9\-_\.]+\.[a-zA-Z1-9\-_]+\.[a-z]{2,3}(/[a-
>z\-/\._\?=&]+)?))", "href=\"http://\\2", $string);
> return($string);
>}
>
>Maar gaat het vaak mis als de url ook nog een querystring heeft.
>Bijvoorbeeld:
>
>http://www.test.com/test.php?forum=30&topic=88
>
>levert uiteindelijke een linkje op naar
>
>http://www.test.com/test.php?forum=
>
>Waarom gaat dit niet goed?

Omdat de twee reguliere expressies geen cijfers toelaten in deze
querystring. De twee reguliere expressies met toelating van cijfers in
de query string worden dan respectievelijk:


((http://|ftp://)?([a-zA-Z1-9\-_\.]+\.[a-zA-Z1-9\-_]+\.[a-z]{2,3}(/[a-z\-/\._\?=&0-9]+)?))

en


((href=\")([a-zA-Z1-9\-_\.]+\.[a-zA-Z1-9\-_]+\.[a-z]{2,3}(/[a-z\-/\._\?=&0-9]+)?))

--
Groet, Ronald

Jonathan
04/02/03, 16:45
> >Maar gaat het vaak mis als de url ook nog een querystring heeft.
> >Bijvoorbeeld:
> >
> >http://www.test.com/test.php?forum=30&topic=88
> >
> >levert uiteindelijke een linkje op naar
> >
> >http://www.test.com/test.php?forum=
> >
> >Waarom gaat dit niet goed?
>
> Omdat de twee reguliere expressies geen cijfers toelaten in deze
> querystring. De twee reguliere expressies met toelating van cijfers in
> de query string worden dan respectievelijk:
>
>
>
((http://|ftp://)?([a-zA-Z1-9\-_\.]+\.[a-zA-Z1-9\-_]+\.[a-z]{2,3}(/[a-z\-/\.
_\?=&0-9]+)?))
>
> en
>
>
>
((href=\")([a-zA-Z1-9\-_\.]+\.[a-zA-Z1-9\-_]+\.[a-z]{2,3}(/[a-z\-/\._\?=&0-9
]+)?))

Oh ja ik begrijp het. Ik zie dat je ook ? en & hebt toegevoegd. Ik neem aan
dat ik dan ook het 'domein' van {2,3} moet uitbreiden naar de maximaal
toegestane lengte van een query string (wat is die eigenlijk? 255 ofzo?)?
Zou sowieso uitgebreid moeten ivm .info tld's...

Groeten,
Jonathan

Ronald Paul
04/02/03, 17:05
"Jonathan" <jonathan@nospam-tricolon.com> schreef:

>Oh ja ik begrijp het. Ik zie dat je ook ? en & hebt toegevoegd.

Neehoor, die stonden er al, anders had je in plaats van
http://www.test.com/test.php?forum= alleen maar een link naar
http://www.test.com/test.php teruggekregen.

>Ik neem aan
>dat ik dan ook het 'domein' van {2,3} moet uitbreiden naar de maximaal
>toegestane lengte van een query string (wat is die eigenlijk? 255 ofzo?)?

Nee. De quantifier {2,3} staat uitsluitend voor de domeinextensie. De
quantifier van de query-string is een +, wat 1 of meer betekend.
Volgens mij had dit eigenlijk een * (0 of meer) moeten zijn, omdat een
query string ook kan ontbreken. Werkte deze regex wel zonder zo'n
query string?

Er is AFAIK nergens een harde grens gelegd voor de maximale lengte van
een URL, maar met 255 zit je in ieder geval wel het veiligst.

>Zou sowieso uitgebreid moeten ivm .info tld's...

Die quantiefier zou daarvoor inderdaad {2,4} moeten worden.

--
Groet, Ronald

Daniel Tryba
04/02/03, 17:25
Ronald Paul <usenet@rcpaul.nl> wrote:
>>Zou sowieso uitgebreid moeten ivm .info tld's...
>
> Die quantiefier zou daarvoor inderdaad {2,4} moeten worden.

{2,6} http://www.icann.org/tlds/

BTW ik snap niet waarom er uberhaupt zoveel moeite wordt gedaan om de
url te checken, dat kan toch niet met enige zekerheid.

|((htt|ft)ps?://.*?)\s| lijkt mij voldoende.


--

Daniel Tryba

Jonathan
04/02/03, 18:15
"Ronald Paul" <usenet@rcpaul.nl> wrote in message
news:o5ov3vgj4k8mfieh4rpvriqujoo33vdi1v@4ax.com...
> "Jonathan" <jonathan@nospam-tricolon.com> schreef:
>
> >Oh ja ik begrijp het. Ik zie dat je ook ? en & hebt toegevoegd.
>
> Neehoor, die stonden er al, anders had je in plaats van
> http://www.test.com/test.php?forum= alleen maar een link naar
> http://www.test.com/test.php teruggekregen.
>
> >Ik neem aan
> >dat ik dan ook het 'domein' van {2,3} moet uitbreiden naar de maximaal
> >toegestane lengte van een query string (wat is die eigenlijk? 255 ofzo?)?
>
> Nee. De quantifier {2,3} staat uitsluitend voor de domeinextensie. De
> quantifier van de query-string is een +, wat 1 of meer betekend.
> Volgens mij had dit eigenlijk een * (0 of meer) moeten zijn, omdat een
> query string ook kan ontbreken. Werkte deze regex wel zonder zo'n
> query string?
>
> Er is AFAIK nergens een harde grens gelegd voor de maximale lengte van
> een URL, maar met 255 zit je in ieder geval wel het veiligst.
>
> >Zou sowieso uitgebreid moeten ivm .info tld's...
>
> Die quantiefier zou daarvoor inderdaad {2,4} moeten worden.

Werkt perfect! Top bedankt!

Groeten,
Jonathan

robert
04/02/03, 18:15
Daniel Tryba <news_nl.internet.www.server-side@canopus.nl>:
> |((htt|ft)ps?://.*?)\s| lijkt mij voldoende.

De \s uitbreiden met een leestekencheck zal geen kwaad kunnen.

--
robert

Daniel Tryba
04/02/03, 20:25
robert <robert+nl.internet.www.server-side@usenet-h.allyourbass.org> wrote:
> > |((htt|ft)ps?://.*?)\s| lijkt mij voldoende.
>
> De \s uitbreiden met een leestekencheck zal geen kwaad kunnen.

Was een beetje in de war met wordboundaries :)

--

Daniel Tryba