Регулярные выражения Perl и их применение


         

Преобразование ftp и http ссылок в теги HTML - часть 4


NOT URLs: aaa.museumm http://aaa.museumm, http://-aaa.com www._aaa.com www.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com TEXT

Как же мы будем форматировать найденный текст? Одним опретром s///. Можно применить вариант с модификатором e, а можно обойтись без него, но тогда в выражении для замены надо будет использовать интерполяцию кода Perl в строку.

Этот оператор подстановки выглядит так:

$text =~ s!$re!<a href="${\($2 ? '' : 'http://')} \L$1\E$3" target="_blank">$1$3</a>!gx;

Регулярное выражение для поиска $re уже составлено, остается сформировать строку для замещения найденного URL. Мы не можем в этой строке замещения сделать конкатенацию вида "…".$var1."…".$var2…, потому что в нем участвует строка без символов-ограничителей строки. Поэтому уже знакомой конструкцией ${\( код Perl ) мы вставляем протокол с помощью тернарного оператора

$2 ? '' : 'http://'

Если протокол в URL был задан, то мы вставляем то, что задано, если не задан, то вставляем http://. Дальше вставляем часть URL без хвоста ($1), предварительно сделав в нем все буквы строчными. За ней идет хвост $3. А в тексте, что будет виден на HTML-странице, будет фигурировать то, что вводил пользователь: $1$3.

Вот вся наша программа:

#!/usr/bin/perl -w use strict;

my $protocol='(?:(?=[FfHh])(?i:http(?>s?)|ftp)://)';

my $host=<<HOST; (?>[A-Za-z0-9]{1,63}\\.) (?>[A-Za-z0-9] (?>[-A-Za-z0-9]{0,62})\\. )* HOST

my $subdom=<<SUBDOM; (?: (?>[A-Za-z0-9] (?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])? )\\. )+ SUBDOM

my $wb='(?![A-Za-z0-9])';

my $zone=<<ZONE; (?i:(?(?=[a-z]{3}$wb)(?>com|net|org|edu|biz|gov|int|mil)| (?(?=[a-z]{2}$wb)[a-z]{2}| (?(?=[a-z]{4}$wb)(?>info|aero|name)| (?(?=[a-z]{6}$wb)museum|(?!) ) ) ) ) (?>\\.[a-z]{2}$wb)? ) ZONE

my $port="(?::\\d{1,5}$wb)";

my $tail=<<TAIL; (?:[/?] (?>[^.,"'<>()[\\]{}\\s\\x7F-\\xFF]*) (?:(?>[.,?]+) (?:[^"'<>()[\\]{}\\s\\x7F-\\xFF]+) )* (?<![,.?!-]) ) TAIL




Содержание  Назад  Вперед