Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BBcode разбор 
V
    Опции темы
kvv
Дата 4.5.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Код

$txt='<b><i>так</b></i>';
$patterns=array('/\[b\](.*?)\[\/b\]/si','/\[u\](.*?)\[\/u\]/si','/\[i\](.*?)\[\/i\]/si');
$replacements=array('<b>\\1</b>','<u>\\1</u>','<i>\\1</i>');
$txt = preg_replace($patterns,$replacements,$txt);


Текст отпарсится так: <b><i>так</b></i>. Для обычного браузера еще ничего, но в во флеше это криво воспримется - последующий текст будет жирным. Как это можно исправить? 
PM MAIL   Вверх
IvanB
Дата 4.5.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



У тебя что написано? smile
Ты 
Код
'/\[b\](.*?)\[\/b\]/si'
 заменяешь на 
Код
'<b>\\1</b>'
......
У тебя в строке такого нет. smile 
$txt которая.  

Это сообщение отредактировал(а) IvanB - 4.5.2006, 16:13
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
kvv
Дата 4.5.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Описка.
Код
$txt='[b][i]так[/b][/i]';
$patterns=array('/\[b\](.*?)\[\/b\]/si','/\[u\](.*?)\[\/u\]/si','/\[i\](.*?)\[\/i\]/si');
$replacements=array('<b>\\1</b>','<u>\\1</u>','<i>\\1</i>');
$txt = preg_replace($patterns,$replacements,$txt);

 
PM MAIL   Вверх
Mal Hack
Дата 4.5.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Я вообще по другому делал...
Глянул, делал вообще не оптимально...
Я бы тут сейчас сделал бы так:
Код

$txt = preg_replace("#]\(b|i|u)\](.+?)\[/\\1\]#ie","<\\1>\\2</\\1>",$txt);
 
PM ICQ   Вверх
S.A.P.
Дата 5.5.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Mal Hack, а как быть со вложенными тегами? 
PM MAIL   Вверх
Replicator
Дата 5.5.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 30.4.2006
Где: Outer Heaven

Репутация: нет
Всего: нет



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

P.S. MalHack, спасибо за код. А то у меня гораздо длиннее выражение, да и помедленней. 
--------------------
 
PM WWW ICQ   Вверх
S.A.P.
Дата 5.5.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Цитата(Replicator @  5.5.2006,  14:33 Найти цитируемый пост)
Я у себя дважды это делаю, хотя можно это делать в цикле, пока все не заменишь.
 почему дважды? почему не 3 ... не 5.

И как оптиматьно определить, что еще не все заменилось? 

 smile  
PM MAIL   Вверх
R.M.
Дата 5.5.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Анархист
****


Профиль
Группа: Участник
Сообщений: 2164
Регистрация: 8.6.2005
Где: Питер

Репутация: нет
Всего: 30



S.A.P., можно проверить соответствие строк если заменённая равна той которая была до этого прекращать цикл smile  


--------------------
Помнишь как бодрили дискотеки прошлого века? Теперь стул, компьютер и нету человека.

Nokia LifeStyle - Всё для смартфонов Nokia 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 5.5.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(S.A.P. @  5.5.2006,  14:00 Найти цитируемый пост)
Mal Hack, а как быть со вложенными тегами?  


Цитата(Replicator @  5.5.2006,  14:33 Найти цитируемый пост)
Прогнать регулярку несколько раз. Я у себя дважды это делаю, хотя можно это делать в цикле, пока все не заменишь.


Цитата(Куксикус @  5.5.2006,  15:48 Найти цитируемый пост)
S.A.P., можно проверить соответствие строк если заменённая равна той которая была до этого прекращать цикл smile   


А для чего я там модификатор e поставил?
Ну тут вообще тогда надо бы делать через preg_replace_callback, в принципе это лучше с той стороны, что в плане кодинга интеитивнее понятнее и есть больше шансов на дальнейшее улучшение. 
PM ICQ   Вверх
kvv
Дата 5.5.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Код
<?php
$txt=' [b] [i] test [/b] [/i]   [b] [i] test [/i] [/b]';
$txt = preg_replace("#]\(b|i|u)\](.+?)\[/\\1\]#ie","<\\1>\\2</\\1>",$txt);
echo htmlspecialchars($txt);
?>

Warning: Compilation failed: reference to non-existent subpattern at offset 8 in c:\program files\apache group\apache\htdocs\test.php on line 5 
PM MAIL   Вверх
Mal Hack
Дата 5.5.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Код
<?php
$txt=' [b] [i] test [/b] [/i]   [b] [i] test [/i] [/b]';
$txt = preg_replace("#\[(b|i|u)+\](.+?)\[/\\1\]#ies","<\\1>\\2</\\1>",$txt);
echo htmlspecialchars($txt);
?>


Отладь сам. 
PM ICQ   Вверх
kvv
Дата 6.5.2006, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Не очень силен в регах. Поясните пожалуста:
Цитата
e
If this modifier is set, preg_replace() does normal substitution of backreferences in the replacement string, evaluates it as PHP code, and uses the result for replacing the search string. 

Если этот модификатор установлен, функция делает нормальную замену обратных ссылок в скроке замены, выполняет это как пхп код, и использует результ для замены в поисковой строке.
Как это понять?

Еще не пойму смысла знака # в начала и в конце. В хелпе написано только это:
Цитата
If the PCRE_EXTENDED option is set, an unescaped # character outside a character class introduces a comment that continues up to the next newline character in the pattern. 

Но у нас PCRE_EXTENDED  не установлен. Да и зачем закомменчивать всю строку?


Вот, что у меня получилось(убрал #, заэкранил \):
Код
<?php
$txt=' [b] [i] test [/b] [/i]   [b] [i] test [/i] [/b]';
$txt = preg_replace("/\[(b|i|u)\](.+?)\[\/\\1\]/is","<\\1>\\2</\\1>",$txt);
echo htmlspecialchars($txt);
?>

Выдает:
Код
<b> [i] test </b> [/i] <b> [i] test [/i] </b>

Но замена-то  сделана по-одному разу, а если использовать квантификатор e, то выдает это:
Код
Parse error: parse error in c:\program files\apache group\apache\htdocs\test.php(3) : regexp code on line 1

Fatal error: Failed evaluating code: [i] test in c:\program files\apache group\apache\htdocs\test.php on line 3
  

Это сообщение отредактировал(а) kvv - 6.5.2006, 06:39
PM MAIL   Вверх
S.A.P.
Дата 6.5.2006, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Цитата(Куксикус @  5.5.2006,  15:48 Найти цитируемый пост)
S.A.P., можно проверить соответствие строк если заменённая равна той которая была до этого прекращать цикл 

это далеко не оптимальное решение  smile .


kvv, может быть Mal Hack, имел ввиду вот это:
Код

$txt=' [b] [i] test [/b] [/i]   [b] [i] test [/i] [/b]';
function BBCode($str)
{
    return preg_replace("#\[(b|i|u)+\](.+?)\[/\\1\]#ies","'<$1>'.BBCode('$2').'</$1>'",$str);
}

echo htmlspecialchars(BBCode($txt));


но у меня есть подозрения, что код будет медленно работать... 
PM MAIL   Вверх
kvv
Дата 7.5.2006, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Ну хотя-бы работает. Всем спасибо. 
PM MAIL   Вверх
Mal Hack
Дата 7.5.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(S.A.P. @  6.5.2006,  08:37 Найти цитируемый пост)
kvv, может быть Mal Hack, имел ввиду вот это:

Вообще-то я несколько другое имел ввиду...
Реги сами поддерживают рекурсивный проход, но вот синтаксис точно не помню.
К примеру при таком варианте не прокатит вот это:
Не должно по крайней мере.
Код
$txt=' [b] [i] test [/b] [/i]   [b] [i] test [/i] [/b]';
 
PM ICQ   Вверх
S.A.P.
Дата 7.5.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Цитата(kvv @  7.5.2006,  05:55 Найти цитируемый пост)
Ну хотя-бы работает. Всем спасибо.  
 это я привел для примера. Для рабочего решения это явно не катит, т.к. существует проблема с кавычками. С рекурсивными регами у меня ничего не вышло (может при замене они не работают?). 

Если собираешься использовать ручную рекурсию, то советую разобраться и переделать код на preg_replace_callback.
  

Это сообщение отредактировал(а) S.A.P. - 7.5.2006, 16:11
PM MAIL   Вверх
kvv
Дата 7.5.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Не пойму вас.
Мне тот вариант понравился. Вроде все работает.
Смысла в preg_replace_callback() не увидел, ведь это тоже самое получается...  Может, я что-то там не понимаю?

Код
<?php
function BBCode($str)
{
    return preg_replace("#\[(b|i|u)+\](.+?)\[/\\1\]#ies","'<$1>'.BBCode('$2').'</$1>'",$str);
}

$txt='
[b] [i] ttt [/i] [/b]
[b] [i] ttt [/b] [/i]
[b] [i] [u] ttt [/u] [/i] [/b]
[b] [i] [u] ttt [/u] [/b] [/i]
[b] [i] [u] ttt [/u] [/u] [/u]
[b] [i] [u] ttt [/b] [/u] [/i]';
echo nl2br(htmlspecialchars(BBCode($txt)));
?>

Код
<b> <i> ttt </i> </b>
<b> [i] ttt </b> [/i]
<b> <i> <u> ttt </u> </i> </b>
<b> [i] <u> ttt </u> </b> [/i]
<b> [i] <u> ttt </u> [/u] [/u]
[b] [i] [U] ttt </b> [/U] [/i]
  

Это сообщение отредактировал(а) kvv - 7.5.2006, 16:46
PM MAIL   Вверх
Mal Hack
Дата 7.5.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Хм... Что-то через рекурсию внутри шаблонов у меня не получилось. Сделал вот так:
Код
<?php
function BBCode($str,$str2="",$str3="")
{
    if( isset($str2) && isset($str3) )
    {
    $str = "<".$str.">".$str2."</".$str.">".$str3;
        
        
    }
    return preg_replace("#\[(b|i|u)+\](.+?)\[/\\1\](.*?)$#ies","BBCode('$1','$2','$3')",$str);
}
$txt='
[b] [i] ttt [/i] [/b]
[b] [i] ttt [/b] [/i]
[b] [i] [u] ttt [/u] [/i] [/b]
[b] [i] [u] ttt [/u] [/b] [/i]
[b] [i] [u] ttt [/u] [/u] [/u]
[b] [i] [u] ttt [/b] [/u] [/i]';
echo nl2br(htmlspecialchars(BBCode($txt)));
?>
 
PM ICQ   Вверх
kvv
Дата 8.5.2006, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Эм... непонял. Мы берем тег в квадратных скобках, в BBCode() он оказывается в переменной $str - и потом в нем мы опять ищем рег?

Код
<?php
function BBCode($str,$str2="",$str3="")
{
    if( isset($str2) && isset($str3) )
    {
    $str = "<".$str.">".$str2."</".$str.">".$str3;
        
        
    }
    return preg_replace("#\[(b|i|u)+\](.+?)\[/\\1\](.*?)$#ies","BBCode('$1','$2','$3')",$str);
}
$txt=Array(
'[b] [i] ttt [/i] [/b]',
'[b] [i] ttt [/b] [/i]',
'[b] [i] [u] ttt [/u] [/i] [/b]',
'[b] [i] [u] ttt [/u] [/b] [/i]',
'[b] [i] [u] ttt [/u] [/u] [/u]',
'[b] [i] [u] ttt [/b] [/u] [/i]'
);
foreach($txt as $key => $value)
{
    echo htmlspecialchars(BBCode($value)).'<br>';
}
?>

Выдает:
Код
<<b> <i> ttt </i> </b>></<b> <i> ttt </i> </b>>
<<b> <i> ttt </b> </i>></<b> <i> ttt </b> </i>>
<<b> <i> <u> ttt </u> </i> </b>></<b> <i> <u> ttt </u> </i> </b>>
<<b> <i> <u> ttt </u> </b> </i>></<b> <i> <u> ttt </u> </b> </i>>
<[b] [i] <u> ttt </u> [/u] [/u]></[b] [i] <u> ttt </u> [/u] [/u]>
<<b> <i> <u> ttt </b> </u> </i>></<b> <i> <u> ttt </b> </u> </i>>

Ну так и есть... Получились теги в тегах%) 
PM MAIL   Вверх
Mal Hack
Дата 8.5.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(kvv @  8.5.2006,  05:28 Найти цитируемый пост)
Ну так и есть... Получились теги в тегах%)

А как надо?

Цитата(kvv @  8.5.2006,  05:28 Найти цитируемый пост)
Мы берем тег в квадратных скобках, в BBCode() он оказывается в переменной $str - и потом в нем мы опять ищем рег?

Другого выхода я пока не вижу, т.к. рекурсивные шаблоны у меня не стали работать. 
PM ICQ   Вверх
kvv
Дата 8.5.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Цитата(Mal Hack @  8.5.2006,  13:44 Найти цитируемый пост)
А как надо?

Мой второй пост сверху - там как раз получилось как надо. Ведь самое главное - чтоб не было перекрывания тегов, то есть ситуаций типа <b><i>smth</b></i> 
PM MAIL   Вверх
Mal Hack
Дата 8.5.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Код
<?php
function BBCode($str,$str2="",$str3="")
{
    if( isset($str2) && isset($str3) )
    {
    $str = "<".$str.">".$str2."</".$str.">";
        
        
    }
    return preg_replace("#\[(b|i|u)+\](.+?)\[/\\1\]#ies","BBCode('$1','$2')",$str);
}
$txt='
[b] [i] ttt [/i] [/b]
[b] [i] ttt [/b] [/i]
[b] [i] [u] ttt [/u] [/i] [/b]
[b] [i] [u] ttt [/u] [/b] [/i]
[b] [i] [u] ttt [/u] [/u] [/u]
[b] [i] [u] ttt [/b] [/u] [/i]';
echo nl2br(htmlspecialchars(BBCode($txt)));
?>
 
PM ICQ   Вверх
kvv
Дата 8.5.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Mal Hack, 
Мы друг друга не понимаем%) Уже ж все получилось - чего еще париться то?
Предлагаешь ты все ту же рекурсию - скорость парсинга не увеличивается.
Да и что-то ты не то в последнем коде делаешь... Третья переменная в функцию не передается, а ты ее иссетом проверяешь... И выводит он совем не то. 
PM MAIL   Вверх
Mal Hack
Дата 8.5.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Тогда не понимаю в чем проблема?
Вот подправленный:
Код

<?php
function BBCode($str)
{

    return preg_replace("#\[(b|i|u)+\](.+?)\[/\\1\]#ies","'<$1>'.BBCode('$2').'</\\1>'",$str);
}
$txt='
[b] [i] ttt [/i] [/b]
[b] [i] ttt [/b] [/i]
[b] [i] [u] ttt [/u] [/i] [/b]
[b] [i] [u] ttt [/u] [/b] [/i]
[b] [i] [u] ttt [/u] [/u] [/u]
[b] [i] [u] ttt [/b] [/u] [/i]';
echo nl2br(htmlspecialchars(BBCode($txt)));
?>
 
PM ICQ   Вверх
BobiKK
Дата 11.5.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Кстати, а это никто не пробовал? http://pear.php.net/package/HTML_BBCodeParser 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0725 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.