PHP – синтаксический анализатор BBCode – проанализируйте тег ссылки bbcode и не помечен ссылкой

Мне нужно сделать это:

когда пользователь вставляет тег BBCode, с preg_replace и regex я делаю некоторые преобразования.

например

function forumBBCode($str){ $format_search=array( '#\[url=(.*?)\](.*?)\[/url\]#i' ); $format_replace=array( '<a class="lforum" target="_blank" href="$1">$2</a>' ); $str=preg_replace($format_search, $format_replace, $str); $str=nl2br($str); return $str; } 

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

 $format_search '#(www\..*?)#i' $format_replace '<a class="lforum" target="_blank" href="$1">$1</a>' 

он преобразует ссылку 2 раза (в [url] и когда ссылка без этого тега).

поэтому я думаю, что эта функция:

  function checkLinks($string) { $arrelab=""; $arr=split(' |\r\n', $string); for($i=0; $i<sizeof($arr); $i++) { echo $i." - ".$arr[$i]."<br/>"; if ((strpos($arr[$i], 'www.')!==false) or (strpos($arr[$i], 'http://')!==false) or (strpos($arr[$i], 'ftp://')!==false)) { if (strpos($arr[$i], '[url=')===false) { $arr[$i]='<a class="lforum" target="_blank" href="'.$arr[$i].'">'.$arr[$i].'</a>'; } } $arrelab=$arrelab." ".$arr[$i]; } return $arrelab; } 

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

ps извините за мой плохой английский 🙂

ура

Легко обходиться с утверждением lookbehind.

 preg_replace('#(?<![>/"])((http://)?www.........)#im', '<a href="$1">$1</a>' 

Таким образом, регулярное выражение будет пропускать любой URL-адрес, заключенный в «или> или предшествующий /
Это обходной путь, а не решение.

PS: target = "_ blank" является попыткой пользователя. Вырежьте это.

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

Обновление от Мариоса:

preg_replace('#(?<![>/"])(((http|https|ftp)://)?www[a-zA-Z0-9\-_\.]+)#im', '<a href="$1">$1</a>'

Ваша проблема может быть идентифицирована путем чтения вашего заголовка. Разбор в сочетании с регулярным выражением

Вы не можете «анализировать» html или bb-код с регулярным выражением, потому что они не являются обычными языками.

Вы должны написать (или найти) парсер bb-кода вместо использования регулярных выражений.

Первый результат Google для синтаксического анализа BB-кода – NBBC: новый BBCode Parser . Но я никогда не использовал его, поэтому я не могу прокомментировать качество.

Существует более простой способ сделать это. Я создал прогулку в блоге разработчиков RedBonzai. Ссылка на него находится здесь: http://www.redbonzai.com/blog/web-development/how-to-create-a-bb-codes-function-in-php/

Дайте знать, если у вас появятся вопросы.

RedBonzai