Как укоротить длинные URL и длинные слова?
У web-мастеров иногда возникает задача укоротить длинные URL, которые вводят в форму участники форумов. Из-за длинных ссылок расползается дизайн страниц. Предположим, кто-то отослал на форум такой текст:
Рекомендую посетить: http://www.Isafhwoeufqfsjvdkghalhasdghasglhasgl. com/fasfasfasdf/
На самом деле ссылка может оказаться еще длинее. В HTML-коде страницы форума эта ссылка должна появиться в виде URL:
Рекомендую посетить: <а href="
http://www.Isafhwoeufqfsjvdkghalhasdghasglhasgl.com/fasfasfasdf
/” target=”_blank"> http://www.lsafhwoeufqfsjvdkghalhasdghasglhasgl.com/fasfasfasdf/>
Внутри тега а ссылку, естественно, обрезать не надо, тем более что в видимом тексте ее не будет, а вот то, что стоит перед тегом «>, будет видно, и если это «слово» будет слишком длинным, то это может испортить дизайн. Надо после 50-го символа такой ссылки вставить три точки и получить такой текст:
Рекомендую посетить: <а href="
http://www.Isafhwoeufqfsjvdkghalhasdghasglhasgl.com/fasfasfasdf
Г target=”_blank"> http ://www. Isafhwoeufqfsjvdkghalhasdghasglhasgl. co...
Другие длинные слова (не ссылки) надо также урезать. Мало ли что может ввести пользователь... Я нашел такое решение:
s/(A|s)(?!href=")(S{5O})S+/$1$2.../g;
Предполагаем, что текст находится в переменной Регулярное выражение начинает поиск от начала текста и каждого пробельного символа. Если после этого не стоит фрагмент href=, то проверяется, есть ли после этого «слово» дтиной 50 символов, после которого стоит непробельный символ. Если да. то происходит замена всего, что найдено на $1 — пробельный символ перед длинным «словом», 50 символов с начала этого «слова» на $7, эти же 50 символов с начала длинного «слова», а последующие непробельные символы заменяются на три точки. Если бы в начале шаблона вместо /Л|У стояло просто (s)< то длинное «слово», стоящее в самом начале текста, не было бы укорочено.
Вот еще один вариант с использованием кода Per) в части замены:
s/((S{50})S+)/index($1,’href=') > -1 ? $1 : «$2... “/де;
Ищем 50 непробельных символов, сразу за которыми есть хотя бы один непробельный символ. Эти 50 символов берем в переменную 52. а все длинное «слово» берем в переменную $1. В части замены проверяем, есть ли фрагмент текста href= в переменной $1. Если он есть, то заменяем найденное на 5/, т.е. на себя, а если нет, то заменяем найденное на текст $2, за которым идут три точки.
Это был практический пример задачи, которую я решал по просьбе одного вебмастера.
Предположим, мы хотим узнать, есть ли в данном тексте непробельный символ между7 тегами. Предполагается, что теги правильно закрыты и нетеговых символов < и > не встречается. Вот первое решение:
$_=' <рррр>’ х 13000;