Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


15:40.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.