Умное преобразование линков

WP

^_^
Я специально подождал пока тема профлудится)
Теперь привожу ПРАВИЛЬНОЕ решение.
PHP:
$text = '... [url]http://phpclub.ru/[/url] ... <a href="...>">[url]http://phpclub.ru[/url]</a> [url]http://phpclub.ru[/url] ... <img src="http://phpclub.ru">... ';
function callback($m)
{
 if (isset($m[4])) {return '<a href="'.htmlspecialchars($m[0],ENT_QUOTES).'">'.htmlspecialchars($m[0]).'</a>';}
 return $m[0];
}
$result = preg_replace_callback('~<a(?:\s(?:[^\\>\'"]*(?:([\'"]).*?(?<!\\\\)\1)?)*)?>((?:(?R)|.)*?)</a>|<(?:[^\\>\'"]*(?:([\'"]).*?(?<!\\\\)\3)?)*>|([a-z\d]+://[^\s<]+)~si','callback',$text);
echo $result; 
// ... <a href="http://phpclub.ru/">[url]http://phpclub.ru/[/url]</a> ... <a href="...>">[url]http://phpclub.ru[/url]</a> <a href="http://phpclub.ru">[url]http://phpclub.ru[/url]</a> ... <img src="http://phpclub.ru">...
-~{}~ 07.07.07 17:21:

з.ы. ув. тредстартер, за это бы время коли не знаешь регулярок написал бы на строковых функциях, это не так сложно, ищем в цикле вхождение '<a ' и '://', находим кто ближе, если ближе '<a' то находим после него '>', и повторяем операцию, если ближе :// то заменяем на ссылку.
Можно конечно еще пробежаться по <a... а не тупо искать '>' зажигая и гася флаг inquotes.
 

svtol

Новичок
большое спасибо!
но вообщето регулярку нужно запихать в модификатор смарти
т.е. есть некий модификатор через который выводяться записи блогов, вот в нем то это и надо провернуть. ну а модификаторы смартиэто типа функции, а функция внутри функции че то не работает.
можнео реализовать это без функции? я как бы не догнал до конца как сдлано, но, насколько я понимаю если http://бла_бла окружают пробелы то преобразовывать а если не пробелы то не делать ниче.
 

planarik

Новичок
Ради интереса скормил своему блоку. Результат одинаковый. А если не видно разницы...
 

WP

^_^
svtol
Всё будет работать, просто function callback надо вынести за функцию модификатора чтоб при повторном вызове функции модификатора заного не объявлялась callback.
planarik
Ты б не позорился. Скорми своему "блоку" текст с несколькими тегами и посмотри результат, и посмотри что будет если текст ссылки отличается от URL'а. Платишь больше ты потому что я решил задачу в один проход, а ты в два.
 

planarik

Новичок
Ты б не позорился. Скорми своему "блоку" текст с несколькими тегами и посмотри результат, и посмотри что будет если текст ссылки отличается от URL'а. Платишь больше ты потому что я решил задачу в один проход, а ты в два.
Согласен.
 

svtol

Новичок
благодарю все работает. ща буду пытаться понять как это сделано :)

-~{}~ 07.07.07 21:11:

ой нет! не работает! он и других тагах типа img преобразует, а это не есть здорово.

-~{}~ 07.07.07 21:12:

я все таки думаю что нужно по пробелам определять обрабатывать или нет.
так наверное проще и вернее будет
 

WP

^_^
planarik
Молодец =)
svtol
Смотри я подправил, теперь URL'ы внутри тегов не преобразует.

По каким еще пробелам? =)

-~{}~ 07.07.07 21:27:

Кажется, я воткнул о чем ты говоришь по поводу пробелов, давай тихо спишем это на трудный день ;)
 

svtol

Новичок
день и правда тяжелый а вот регулярка терь ваще что то не вообразимое творит. картинки порезало что то..
 

WP

^_^
svtol
Запости текст который обрабатывается неправильно.
 

Андрейка

Senior pomidor developer
<img src=http://www.ya.ru>
<a href="&lt;img src=http://www.ya.ru&gt;">&lt;img src=http://www.ya.ru&gt;</a>

-~{}~ 08.07.07 13:10:

т.е. есть некий модификатор через который выводяться записи блогов
а почему товарищи, набирающие текст в виде HTML не могут сами сделать нужные им ссылки?
 

svtol

Новичок
а почему товарищи, набирающие текст в виде HTML не могут сами сделать нужные им ссылки?
для некоторых это слишком сложно, некоторые забывают.

все таки вернусь к пробелам. ИМХО решение состоит в том что если урл окружают с двух сторон два пробела то надо его конвертить, а если не пробелы (даже если перед http нет пробела) то значит урл в таге каком то и не надо с ним ниче делать.
как такую регулярку сделать?

пример:

было:
<img src="http://svtol.1nsk.ru/blog/images/1/7i1m6ki85j.jpg" alt="" hspace="5" vspace="5" border="1" title="" />

стало:
<img src="<a href="http://svtol.1nsk.ru/blog/images/1/7i1m6ki85j.jpg&quot;">http://svtol.1nsk.ru/blog/images/1/7i1m6ki85j.jpg&quot;</a> alt="" hspace="5" vspace="5" border="1" title="" />
 

svtol

Новичок
я много пытался, ну не понимает мой моск регулярку...
что то простое могу, а тут надо типа проверить пробелы есть или нет как - хбз
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
много пытался, ну не понимает мой моск регулярку...
Воскресенье утро...

'#<img.+src=["\']?((http|https)://([a-z0-9%/\._-]+))["\']?.*>#i'

-~{}~ 08.07.07 08:48:

Может натолкнёт на какие мысли...
Паттерн должен быть более "широким".

1. Нужно проверить на валидность хост.
2. Валидность картинки в src.

В данном случае регуляр сработает и http://a/image.fff

Тут уж, пожалуйста, самостоятельно постарайтесь...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Проблема решения с регекспами в том, что обрабатывать они будут только корректный HTML и не во всех случаях.
Примеров можно привести массу, например,
<!-- <a href=http://domain.tld-->http://example.com
https:\\site.com\ ( IE поймет)
просто http://
и т.д.

Когда я писал анонимайзер, единственным решением был парсер на автоматах, но это автору топика ни к чему.
Так что надо делать как проще и учить юзеров как этим пользоваться :)
 

WP

^_^
grigori
Враки. Никакой "проблемы с регекспами" нет, и можно учесть <!-- и т.д. Точно также как и на автоматах. Парсер в шаблонизаторе на порядок сложнее и ничего - работает. Регулярки это те же автоматы только программируемые.

PHP:
$text = '... http://phpclub.ru/ ... <a href="...">http://phpclub.ru</a> http://phpclub.ru ... <img src="http://phpclub.ru">...
<!-- <a href=http://domain.tld-->http://example.com</a>';
function callback($m)
{
 if (isset($m[4]) and $m[4] !== '') {return '<a href="'.htmlspecialchars($m[0],ENT_QUOTES).'">'.htmlspecialchars($m[0]).'</a>';}
 return $m[0];
}
$result = preg_replace_callback('~<--.*?-->|<a(?:\s(?:[^\\>\'"]*(?:([\'"]).*?(?<!\\\\)\1)?)*)?(?<!/)>((?:(?R)|.)*?)</a>|<(?:[^\\>\'"]*(?:([\'"]).*?(?<!\\\\)\3)?)*>|([a-z\d]+://[^\s<]+)~si','callback',$text);
echo $result;    
/*... <a href="http://phpclub.ru/">http://phpclub.ru/</a> ... <a href="...">http://phpclub.ru</a> <a href="http://phpclub.ru">http://phpclub.ru</a> ... <img src="http://phpclub.ru">...
<!-- <a href=http://domain.tld--><a href="http://example.com">http://example.com</a></a>*/
 

WP

^_^
MajestiC
Минздрав предупреждает, курение опасно для вашего здоровья.
 

Андрейка

Senior pomidor developer
WP
а еще есть <a....name="smb"..../>.. вроде как вполне себе xhtml валидная нессылка... нада добавить) доведем рег до десятка кб)
 
Сверху