Проблема с регуляркой заменяющей ссылки в тексте на HTML ссылки

RadMax

Новичок
Проблема с регуляркой заменяющей ссылки в тексте на HTML ссылки

Задача:
Если в тексте встречается ссылка, нужно преобразовать её в HTML.

Например:
На вход:
Заходите на сайт www.test.ru

На выход:
Заходите на сайт <a href="www.test.ru">www.test.ru</a>

Регулярку для этого я уже написал, она пропускает уже имеющиеся HTML ссылки, но проблема вот в чём:

Если в тексте есть HTML ссылка у которой в title идёт например такой текст "Кликни www.test.ru здесь", то этот www.test.ru тоже преобразуется в <a href="www.test.ru">www.test.ru</a>, так же проблема возникнет если между тегами <a> будет идти такой же текст("Кликни www.test.ru здесь").

Кто нибудь знает как можно избежать этого?
 

Вурдалак

Продвинутый новичок
Можно через preg_split()
PHP:
$input_spl = preg_split('/(<.*?>)/s', $input, -1, PREG_SPLIT_DELIM_CAPTURE);
С чётными индексами будет текст, с нечётными — теги. Плюс надо будет учесть когда открывается/закрывается <a>.

Это «решение» не учитывает «грязный» HTML, но более универсальное решение будет намного сложнее.

-~{}~ 16.01.10 17:15:

P.S. После "<.*?>" пробела нет — он появился автоматически.
 

RadMax

Новичок
Автор оригинала: Вурдалак
Можно через preg_split()
PHP:
$input_spl = preg_split('/(<.*?>)/s', $input, -1, PREG_SPLIT_DELIM_CAPTURE);
С чётными индексами будет текст, с нечётными — теги. Плюс надо будет учесть когда открывается/закрывается <a>.

Это «решение» не учитывает «грязный» HTML, но более универсальное решение будет намного сложнее.

-~{}~ 16.01.10 17:15:

P.S. После "<.*?>" пробела нет — он появился автоматически.
А зачем мне это?! Если бы я хотел избавиться от тэгов воспользовался бы strip_tags. Мне нужно сделать текстовые ссылки активными, и учесть два условия.
 

Вурдалак

Продвинутый новичок
PHP:
$input_spl = preg_split('/(<.*?>)/s', $input, -1, PREG_SPLIT_DELIM_CAPTURE);

for($i = 0; $i < count($input_spl); $i++)
{
	if( $i & 1 )
	{
		// Тег
		// Ставишь/снимаешь какой-то флаг, если это <a ...> или </a>
	}
	else
	{
		// Текст
		// Заменешь ссылки, если флаг сброшен
	}
}

$output = implode('', $input_spl);
 

RadMax

Новичок
Вот блин, получилось, и так было просто, чёт я тупанул. Спасибо вам!
 
Сверху