Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Регулярное выражение для оборачивания ссылок

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
calipso
Отправлено: 05 Декабря, 2009 - 14:21:38
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Добрый день!

Есть задача: обернуть ссылки bb-кодами, например чтобы
стало
CODE (text):
скопировать код в буфер обмена
  1. [url="http://ya.ru"]http://ya.ru[/url]
.

Вопрос заключается в следующем: как обернуть только не обёрнутые ссылки, т.е. если уже ссылка обёрнута - она не оборачивалась. Т.е., при виде ссылки
CODE (text):
скопировать код в буфер обмена
  1. [url="http://ya.ru"]http://ya.ru[/url]
или
CODE (text):
скопировать код в буфер обмена
  1. <a href="http://ya.ru">http://ya.ru</a>
ничего не происходило.

Как это лучше и правильнее сделать?
 
 Top
trot
Отправлено: 05 Декабря, 2009 - 14:45:09
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Мне кажется такую задачу не решить одним действием.
Я бы ее решал так.
1. Найти все обернутые ссылки, вырезать их и запомнить в массиве, а на место ссылок вставить метки, ассоциированную с индексами в массиве.
2. Найти все оставшиеся ссылки (т.е. не обернутые) и их обернуть.
3. Вставить из массивы вырезанные ранее ссылки.
Вот и все.

Считаю, что необходимо обратить на следующие особенности.
а) будут ли в исходном тексте комментарии, в которых могут встречаться ссылки, и что в этом случае нужно делать.
б) обратить внимание на то, что ссылки могут встречаться, как в кавычках, так и в апострофах (это относится скорее всего к обернутым ссылкам).
 
 Top
Champion Супермодератор
Отправлено: 05 Декабря, 2009 - 14:47:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




в регулярках можно использовать утверждения. В твоем случае ты долже написать устовие, что слева нету [url=". Попробуй сам, а если не получится, поправим.
 
 Top
calipso
Отправлено: 05 Декабря, 2009 - 15:01:21
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Спасибо за быстрые ответы Улыбка

trot пишет:
Мне кажется такую задачу не решить одним действием.

Я тоже сначала думал в данном направлении, но стало получатся громоздко и выходить за пределы решения при помощи регулярного выражения Улыбка

Champion пишет:
Попробуй сам, а если не получится, поправим.

Набросал
CODE (text):
скопировать код в буфер обмена
  1. $to = preg_replace('/(?<!(\[url=)|\[url="|<a href|<a href=")((https?|ftp)):\/\/([-A-Z0-9+&@#\/%?=~_|!:,.;]*[A-Z0-9+&@#\/%=~_|])(?<!\[\/url\])/i', '[url="\0"]\0[/url]', $from);
- тяжеловато, но хоть с какой-то проверкой валидности URL. Всё бы было ничего, но текст типа
CODE (text):
скопировать код в буфер обмена
  1. [url="http://ya.ru/index.html"]http://ya.ru/index.html[/url]
стал превращаться в
CODE (text):
скопировать код в буфер обмена
  1. [url="http://ya.ru/index.html"][url="http://ya.ru/index.html"]http://ya.ru/index.html[/url][/url]

Т.е., в первой чаасти строки [url="http://ya.ru/index.html"] URL не обрабатыватся (как и должно быть), а вот после - http://ya.ru/index.html[/url] - обрабатыватся.

Как быть?
 
 Top
Champion Супермодератор
Отправлено: 05 Декабря, 2009 - 15:53:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Тогда еще утверждение относительно [/url] справа от ссылки напиши.
 
 Top
calipso
Отправлено: 05 Декабря, 2009 - 15:56:39
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Champion пишет:
Тогда еще утверждение относительно [/url] справа от ссылки напиши.

А это
не считается?
 
 Top
Champion Супермодератор
Отправлено: 05 Декабря, 2009 - 16:14:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




а, я не увидел. Считается, только без <. А то оно всегда ложным будет, потому что ты утверждаешь как бы налево. А надо направо.
 
 Top
trot
Отправлено: 06 Декабря, 2009 - 23:41:55
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Предлагаю следующий варинат

CODE (text):
скопировать код в буфер обмена
  1.  
  2. $a='[url="http"]http[/url]
  3. http';
  4.  
  5. $a=preg_replace('/(?:(?<=\[url=)(?:"http"])?(?:http))|(http)/e','("\\1")?("[url=\"\\1\"]\\1[/url]"):("\\0")',$a);
  6.  


Если вметсо http вставить шаблон ссылки, получиться тяжеловато.
А если еще попытаться учесть апострофы, тогда задача не имеет решения,
потому что функция preg_replace начинает заниматься дополнительным экранированием.

Варинат предложенный ранее я считаю менее тяжелым чем этот.
 
 Top
Phantik
Отправлено: 07 Декабря, 2009 - 09:44:05
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


Помог: 0 раз(а)




Сделай в два хода:
1 вырежи все обертки из обернутых ссылок, сохрани в промежуточной строке(файле)
2 оберни все ссылки в промежуточном файле.
Думаю что регулярки для первого и второго случая будут не сложные.
 
 Top
calipso
Отправлено: 07 Декабря, 2009 - 11:06:45
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




trot пишет:
Предлагаю следующий варинат

Спасибо за вариант, попробую поковырять.

Phantik пишет:
Сделай в два хода

Да как-то не особо хочется в несколько заходов делать Недовольство, огорчение

Почему всё же не работает так как надо
CODE (text):
скопировать код в буфер обмена
  1. $to = preg_replace('/(?<!(\[url=)|\[url="|<a href=|<a href=")((https?|ftp)):\/\/([-A-Z0-9+&@#\/%?=~_|!:,.;]*[A-Z0-9+&@#\/%=~_|])(?!(\[\/url\]))/i', '[url="\0"]\0[/url]', $from);
?

Вроде же есть для проверки на закрывающий [/url], но не обрабатывается как нужно. Огорчение
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB