Есть текст. В данном тексте нужно найти все слова похожие на ссылки и переделать их в настоящие html ссылки, но есть одно условие в тексте могут попадаться теги в которых есть src="ссылка", так вот эти ссылки внутри тега трогать не нужно. Собственно вопрос в том как составить правило которое не меняло бы ссылки начинающиеся на двойные кавычки. Вот шаблон который мы никак не можем изменить чтобы работало данное условие:
@(([0-9a-zа-я\.-]{2,})\.(ru|com|net)(/[^\s]*)?)@iu
Спасибо за ответ, но мы уже пытались так сделать, я забыл упомянуть. Почему-то не срабатывает, очевидно что парсер просто берет ссылку внутри кавычек игнорируя их как и требует шаблон. Заказчик поставил условие чтобы ссылками было все что заканчивается на домен верхнего уровня (их у нас больше в шаблоне) по-этому проверка на http не требуется, но ссылки с ними также попадают в данный шаблон. Суть в том что кроме переделывания ссылок в реальные ссылки мы еще парсим ссылки на ютюб и переделываем их на встроенное видео, в итоге в тексте появляется тег и внутри атрибута src ссылка всегда будет в двойных кавычках. Если поменять порядок парсеров, то проблему тоже не решить т.к. ссылка на ютюб просто станет обычной ссылкой внутри которой второй парсер сделает фрейм.
mialpet: Тогда выложите тут образец текста с ссылками, которые не срабатывают и код ваших парсеров. И укажите в какую форме должен быть окончательный результат. Все это по порядку. Иначе сложно судить.
Вот видео про Михаила Галустяна www.youtube.com/watch?v=9LyreguVBtI, а еще у него есть свой сайт galustyan.ru/. Если этой информации вам будет мало вы можете найти подробности про него через сайт yandex.ru.
Затем ферез функцию которая делает ссылки, и да я тут погарячился мы не учитываем http: в шаблоне, мы просто разбиваем текст на слова и работаем как можем :) (деревянные мы в регулярках чего уж там скрывать):
function render_links($text, $only_domain = false, $new_window = true)
{
$str='';
$domains= 'ru|com|net';
$pattern = '@(([0-9a-zа-я.-]{2,})\.('.$domains.')(/[^\s\.,]*)?)@iu';
if ($new_window) $attr = 'target="_blank"';
else $attr = '';
if ($only_domain) $domain = '$1.$2';
else $domain = '$0';
$a = explode(" ", $text);
foreach ($a as $s)
{
$http='http://';
if (mb_strpos($s,'https://') !== false) $http='https://';
$s = str_replace(array('https://','http://'), " ", $s);
$replace = ''. $domain .'';
$str.= preg_replace($pattern, $replace, $s).' ';
}
mialpet: Может я чего не понял, но где текст с которым вы работаете. Образец. Зашел на сайт Галустяна и на ютуб, но не понял, что, собственно, я должен был там увидеть?) Вы запостите образец текста сюда, пожалуйста. Я не понимаю с каким текстом вы работаете и чего там ожидать))).
Так текст с Галустяном и был тестовым :) В общем мы долго копали в сторону всяких там опережающих условий, но в итоге нам помог вот такой шаблон '@((^|[\n ])([0-9a-zа-я\.-]{2,})\.('.$domains.')(/[^.\s][^,\s][^\s]*)?)@iu';