PHP - синтаксический анализатор BBCode - анализирует тег ссылки bbcode и ссылку без тега - PullRequest
1 голос
/ 09 июля 2010

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

, когда пользователь вставляет тег 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 извините за мой плохой английский:)

ура

Ответы [ 4 ]

2 голосов
/ 09 июля 2010

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

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

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

2 голосов
/ 09 июля 2010

Обойти это легко, посмотрев за утверждение.

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

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

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

1 голос
/ 14 октября 2010

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

Дайте мне знать, если у вас есть какие-либо вопросы.

RedBonzai

1 голос
/ 09 июля 2010

Вашу проблему можно определить, прочитав ваш заголовок .. Синтаксический анализ в сочетании с regex

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

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

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

...