Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2011, 09:57   #1
(Sandr)
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 37
По умолчанию Регулярка

Есть простенькая функция вида
function bbcodes($text)
{
$regul[]='~\[b\](.+)\[/b\]~mi';
$regul[]='~\[i\](.+)\[/i\]~mi';

$vstav[]='<b>\\1</b>';
$vstav[]='<i>\\1</i>';

$text = preg_replace($regul,$vstav,$text);
}

Как прописать в регулярке так, чтоб если добавить на страницу тэг [code][/code ], то содержимое тэга не попадало под действие других регулярок.
Т.е. если я напишу [ code][b ]жирный[ /b][/ code ] то выведет [b ]жирный[ /b], а не жирный
(Sandr) вне форума Ответить с цитированием
Старый 27.05.2011, 09:58   #2
(Sandr)
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 37
По умолчанию

Т.е. нужно сделать так, чтоб внутри нужного бб-кода все остальные не действовали..
(Sandr) вне форума Ответить с цитированием
Старый 29.05.2011, 15:03   #3
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Ничего умнее в голову не приходит, (исключая полноценный парсер)

PHP код:
function bbcodes($text) {
    
$regul[] = "~\\[b\\](.*?)\\[/b\\]~im";
    
$regul[] = "~\\[i\\](.*?)\\[/i\\]~im";
    
$regul[] = "~\\[(?:/b|b)\\]~i";
    
$regul[] = "~\\[(?:/i|i)\\]~i";
    
    
$vstav[] = '<b>\\1</b>';
    
$vstav[] = '<i>\\1</i>';
    
$vstav[] = '';
    
$vstav[] = '';
    
    
$text=explode("[/code]",$text);
    
    for (
$i=0;$i<count($text);$i+=2) {
        
$t=explode("[code]",$text[$i]);
        
$t[0]=preg_replace($regul,$vstav$t[0]);
        
$text[$i]=implode("",$t);
    }
    
$text implode("",$text);

    return 
$text;

Бибикоды внутри кода не заменяются, кроме того, конструкции типа [ b ] [ code ] Test ! [ /code ] [ /b ] тоже непозволительны. Убираются так же лишние огрызки [ b ] и т.п.

Однако сделано не оптимально и по-индийски. Лучше писать нормальный парсер. В идеале - экстеншн на С.

Последний раз редактировалось graymaster; 29.05.2011 в 15:07.
graymaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Забавная регулярка Necare Помощь студентам 0 10.04.2011 20:28
регулярка designer999 Общие вопросы Delphi 1 18.01.2011 00:49
Регулярка с preg_match_all dekameron PHP 3 15.01.2011 19:08
регулярка :) Teksa Общие вопросы .NET 1 23.12.2010 17:24