Jak używać wyrażeń regularnych Perla w celu wyodrębnienia wszystkich adresów URL określonej domeny (z możliwymi zmiennymi subdomenami) z określonym rozszerzeniem ze zwykłego tekstu? Próbowałem:Używanie wyrażenia regularnego w celu wyodrębnienia adresów URL z tekstu zwykłego za pomocą Perl
my $stuff = 'omg http://fail-o-tron.com/bleh omg omg omg omg omg http://homepage.com/woot.gif dfgdfg http://shomepage.com/woot.gif aaa';
while($stuff =~ m/(http\:\/\/.*?homepage.com\/.*?\.gif)/gmsi)
{
print $1."\n";
}
To nie strasznie i daje mi:
http://fail-o-tron.com/bleh omg omg omg omg omg http://homepage.com/woot.gif
http://shomepage.com/woot.gif
Myślałem, że nie stałoby się, ponieważ używam .*?
, które powinny być non-chciwy i dać mi najmniejszy mecz. Czy ktoś może mi powiedzieć, co robię źle? (Nie chcę jakiś uber-kompleks, konserwy regexp do sprawdzania poprawności adresów URL, chcę wiedzieć, co robię źle, więc mogę uczyć się od niego.)
[RFC 3986 Dodatek C] (http://tools.ietf.org/html/rfc3986#appendix-C) omawia specjalne problemy związane z wyodrębnianiem URI, w tym przypadki, gdy biała spacja jest dopuszczalna. "W niektórych przypadkach konieczne może być dodanie dodatkowych spacji (spacje, podziały wierszy, tabulatory itp.) W celu rozbicia długiego URI na linie. Białe spacje powinny zostać zignorowane po wyodrębnieniu identyfikatora URI." I "dla niezawodności, oprogramowanie, które akceptuje URI typu użytkownika, powinno próbować rozpoznać i usunąć oba ograniczniki i osadzone białe znaki". To powiedziawszy, z doświadczenia, jest to trudne. – Schwern