Wyrazenie regularne pobierajace adresy z "WWW"

1

Jezeli ktos chcialby wspomoc rozwoj 4programmers.net to mam male zadanko :) Chodzi o wyciagniecie z tekstu adresow WWW z przedrostkiem "www" (bez http).

Mamy takie o to wyrazenie:

preg_match_all('~(?<![\p{L}\p{N}_])(?<!://|">)www(?:\.\S+)+\.[a-z]{2,6}(?:\S+)?(?:/|(?![\p{L}\p{N}_]))~iue', $x, $m);
var_dump($m);

Dziala prawidlowo, lecz wyjatkiem jest taki adres http://foo.com?host=www.bar.comost=www.bar.com">http://foo.com?host=www.bar.com</a>`

Regpex takiego adresu nie powinien pobierac.
Efektem jest nieprawidlowe parsowanie adresow URL: http://4programmers.net/Forum/Coyote/Test/174696-parsowanie_urli?p=718460#id718460

Taki regexp jest wykorzystywany tutaj: http://redmine.boduch.net/projects/coyote/repository/entry/trunk/helper/text.helper.php#L384

3

Nie da się tu wykpić porządnym lookbehindem i sprawdzić, czy nie jesteśmy już w URL-u, bo lookbehindy muszą mieć ustaloną długość.

Można się wykpić w inny sposób: dodając lookbehinda wymagającego, byśmy NIE znajdowali się zaraz za znakiem =. W sumie daje to (wstawiłem = do istniejącego lookbehinda odrzucającego dwie inne rzeczy):

~(?<![\p{L}\p{N}_])(?<!://|">|=)www(?:\.\S+)+\.[a-z]{2,6}(?:\S+)?(?:/|(?![\p{L}\p{N}_]))~iue
0

A dlaczego na początku jest (?<![\p{L}\p{N}_])(?<!://|">|=) zamiast prostego (?<=\s|[[(])? Gdzie w klasie można dodać listę początkowych dozwolonych znaków - w tym przykładzie [(.

1 użytkowników online, w tym zalogowanych: 0, gości: 1