Идея написания этого урока возникла, когда я понял, что наверняка такие же задачи пытается решить еще кто-то и возможно такая статейка поможет кому-нибудь поменять рутинный копи-паст на гораздо более интересный и технологичный метод написания кода.
Итак, вводная:
Небольшой сайт. Вбиваю туда ссылки на изображения, причем в каждую ссылку должна быть вложена миниатюра большого изображения.
Изображения разложил в папочке на локальном диске, но там их много и лень копипастить, да и сколько можно? Внезапно обнаружил, что пальцы уже набирают в комстроке:
dir /b /A:-D> spisok.txt
Dir создаст список файлов, /b оставит только имена файлов и их расширения, /A:-D выведет только файлы, но не папки, > загонит это все в текстовой файл с названием spisok.txt.
Теперь получившийся файл открываем в Notepad++ (хотя можно наверное и в редакторе с аналогичным функционалом), где делаем следующее:
Ctrl+H, открывается окно c закладкой Replace,
Find What:
(.*)\.(.*)
Replace with:
<a href="putj\\\1\.\2"><img src="putj\\\1_small\.\2" alt="\1"></a>
Внизу ставим галочку Regular Expression, а Wrap around и .matches newlin убираем.
Жмем Replace All.
Команда, записанная в Find делает следующее:
выбирает в найденной строке все, что до точки, затем ее саму и все после нее. Причем все, что до точки сохраняется под номером 1, а все, что после нее, под номером 2. Мы воспользуемся этим позже.
Далее, команда замещает выбранную строку на то, что записано в Replace with, т.е. на тег ссылки, в котором прописан путь и в который вложен тег картинки c миниатюрой большого изображения.
Теперь, для тех, кто в танке.
(.*)\.(.*)
. — означает найти любой символ
* — означает, взять как можно больше
т.е. «.*» будет означать примерно следующее: найти и выделить как можно больше символов, любых. Т.е. выделить всю строку. И эта команда все и выделит, если бы не:
\. — означает выделить точку.
Однако, точка только что была описана мной как команда, выделяющая любой символ. Дело в том, что Regex использует символ «\» как команду. Эта команда означает одно из двух:
— если за этим символом идет какой-то спецсимвол, который сам используется как команда, то вывести этот символ сам по себе, а не команду. Т.е. «.» он воспримет как «искать любой символ», а «\.» просто как точку. Если ввести просто Бэкслеш «\» то он будет ожидать, что это команда, а двойной бэкслеш «\\» выведет просто сам символ «\».
— если за этим символом идет число, то скопировать сюда то, что было в скобке в поиске (вместо «\1» будет помещено то, что попало в первую слева скобку при поиске, т.е. имя файла до точки, а вместо «\2», то, что во вторую, т.е. расширение файла, и т.д.) — этим мы воспользуемся чуть позже.
Иными словами, если записать это:
(.*)\.(.*)
вот так:
.*\..*
,
то результат поиска не изменится, но Notepad++ никак не отметит для себя и для нас то, что он нашел до точки и после нее. Скобки это как маркеры, разделяющие строку, в данном случае на две части.
<a href="putj\\\1\.\2"><img src="putj\\\1_small\.\2" alt="\1"></a>
<a href="putj
– просто начало тэга. Предполагается, что картинки будут храниться в одной папке, поэтому начало пути к файлу у всех одинаковое. Вместо putj вписывам все, что угодно.
\\ — Как я уже говорил выше, выводит символ «\», не воспринимая его как команду. Если хотим вписать путь, например, Documents\Work\Hlam, то придется все бэкслеши заменять на двойные: Documents\\Work\\Hlam
Из вышесказанного следует, что строка:
\\1\.\2 — выдаст: БЭКСЛЭШ«то что в первой скобке»ТОЧКА«то, что во второй скобке».
"><img src="putj
– это опять кусок просто текста, чтобы закончить тэг <а> и начать тэг , после которого снова вставляется то, что было помещено в скобки при поиске:
\\\1_small\.\2 — где «\\» выводит бэкслэш, нужный в адресе файла, «\1» выводит содержимое первой скобки, «\.» выводит точку, а \2 это содержимое второй скобки.
_small – это просто текст, он вставляется перед точкой. Уменьшенные изображения придется переименовать, чтобы в конце их названия был суффикс _small. Именно для того, чтобы вставить этот _small перед расширением, я и сделал две скобки в поиске, чтобы можно было _small заключить названием файла слева и расширением этого же файла справа.
" alt=" – это опять кусок тэга, атрибут alt, а после него:
="\1"> — где \1 вставляет название файла в атрибут alt, а после него добавляется закрывающий тэг.
Поскольку расширение файла от его имени отделяется всегда только точкой, то ее я «запоминать» не приказываю (т.е. в поиске не заключаю в скобки), но, по сути, можно было бы записать и так:
Find What: (.*)(\.)(.*)
Replace With: <a href="putj\\\1\2\3"><img src="putj\\\1_small\2\3" alt="\1"></a>
Результат будет тот же. Но это выражение гибче, потому, что можно во вторую скобку вписать, например:
[[:s:]] – выделит пробел. Команда поиска будет выглядеть так: (.*)([[:s:]])(.*)
[[:unicode:]] – выделит символ, чей код в юникоде больше 255. Команда поиска будет выглядеть так: (.*)([[:unicode:]])(.*)
[[:punct:]] – выделит один из следующих символов: , " ‘?!;: # $ % & ( ) * + — / < > = @ [ ] \ ^ _ { } | ~ Команда поиска будет выглядеть так: (.*)([[:punct:]])(.*)
Так можно выделить начало и конец какого-то кода или слова, где посередине расположен соответствующий символ. Но это уже за пределами данной статейки.
Благодарю за внимание, надеюсь, кому-нибудь было полезно узнать то, что я здесь изложил.
Ресурсы:
ссылка на оригинал статьи http://habrahabr.ru/post/218267/
Добавить комментарий