aar

Gold Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору DimoN Более корректное регулярное выражение для выделения в тексте поста HTTP адресов. Запускать так: perl.exe to_url.pl sample_urls Скрипт to_url.pl # Выделение HTTP адреса из текста поста # ActiveState ActivePerl v5.6.1 build 633 # Исправленный пример из книги Дж. Фридла "Регулярные выражения". 2-е издание. Издательство "Питер", 2003, стр. 95. # aar special for forum.ru-board.com # Run: perl.exe to_url.pl sample_urls undef $/; # Читаем все подряд, невзирая на разделители строк unless(open F, "< $ARGV[0]") {die "Can't open file. Exit. Have a nice day!\n\n";}; $post = <F>; close F; # Регэксп для выделения имени _только_ хоста, без остальных частей $HostnameRegex = qr/[-a-z0-9]+(?:\.[-a-z0-9]+)*\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|coop|aero|[a-z][a-z])/; $post =~ s{ \b( # Строка с адресом должна находиться на границе \w и \W http[s]?://$HostnameRegex (?:\:\d{1,4})? # Порт (?: # Распознаем остаток адреса после имени хоста /[-a-z0-9:@/&?=+,.!~*'^#$%]* # Отсутствуют символы [ ]. Здесь должен находиться набор тех символов, из которых состоит название пути после имени хоста. (?<![.,!?]) # Негативная ретроспективная проверка. В конце адреса не должно быть точки, запятой, восклицательного знака и знака вопроса, который считаются концом фразы, а не адреса. )? # ост.адр. ) # осн.сохран. }{<a href="$1" target=\"_blank\">$1</a>}gisx; print $post; # В sub ikoncode{} файла ikon.lib делается так: # $post =~ s/\\http:\/\/(\S+)/<a href=\"http:\/\/$1\"\ target=\"_blank\">http:\/\/$1<\/a>/isg; Файл с адресами для проверки работы скрипта sample_urls _https://www.ibm.ee:8080/../123[/s]; http://i.ru-board.com/avatars/private/aar.gif; [s]_https://www.ibm.ee:8080/../123[/s]; [s]https://www.ibm.ee:8080/../123[/s]; Неплохо было бы проверять корректность вложенности парных тегов, как например, [s] [/s], [b] [/b], и т. д. Тогда при переводе в HTML не возникнет незакрытых тэгов и браузер всё благополучно проглотит. Это можно сделать следующим образом. Сначала считывать только лишь открывающие тэги и заносить их типы в стек. Затем читать закрывающие тэги, и если из стека нельзя выпихнуть соответствующий открывающий тэг, то предпринимать какие-либо действия. Это позволит также избавиться от пустых тэгов, между которыми ничего нет ([q][/q]).
|