Come posso usare le espressioni regolari di Perl per estrarre tutti gli URL di un dominio specifico (con sottodomini probabilmente variabili) con un'estensione specifica da testo normale? Ho provato:Uso della regex per estrarre gli URL dal testo normale con 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";
}
fallisce terribilmente e mi dà:
http://fail-o-tron.com/bleh omg omg omg omg omg http://homepage.com/woot.gif
http://shomepage.com/woot.gif
ho pensato che non sarebbe accaduto perché sto usando .*?
, che dovrebbe essere non-avidi e mi darà la più piccola incontro. Qualcuno può dirmi cosa sto facendo di sbagliato? (Non voglio un po 'uber-complesso, regexp in scatola per convalidare gli URL, voglio sapere che cosa sto facendo male così posso imparare da esso.)
[RFC 3986 Appendice C] (http://tools.ietf.org/html/rfc3986#appendix-C) discute i problemi speciali dell'estrazione degli URI, compresi i casi in cui lo spazio bianco è ammissibile. "In alcuni casi, potrebbe essere necessario aggiungere spazi bianchi extra (spazi, interruzioni di riga, tabulazioni, ecc.) Per rompere un URI lungo attraverso le linee. Gli spazi bianchi devono essere ignorati quando viene estratto l'URI." E "per la robustezza, il software che accetta l'URI tipizzato dall'utente dovrebbe tentare di riconoscere e rimuovere entrambi i delimitatori e gli spazi bianchi incorporati". Detto questo, per esperienza, questo è difficile. – Schwern