Мне нужно сделать это:
когда пользователь вставляет тег 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