Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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