Перейти к содержимому



Preg_replace

#1

Поделиться сообщением #1



marker

marker
  • Неактивные
  • 52 сообщений
  • Репутация: 0
0

Отправлено 19 Декабрь 2010 - 15:52

HTML
[level>0]Вы авторизованы[/level]


PHP
$source = preg_replace( "#\[level([^\[\]]*?)\](.*?)\[\/level\]#ie", "\$this->level_blocks('\\2','\\1')", $source );


preg_replace не находит блок [level][/level], могу сказать точно если убрать \[\/level\] - ошибка вероятнее всего кроется в этой части кода.
Вчера весь день над этим мучал свой мозг. :)

Кто хорошо разбирается в регулярных выражениях помогите.

 

 

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Preg_replace
  2. Парсинг строки-шаблона
  3. Не понятно регулярное выражение
  4. Замена слова на ссылку - помогите с preg_replace
  5. Функция preg_replace не работает корректно при копировании

#2

Поделиться сообщением #2



surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 19 Декабрь 2010 - 16:15

это что за изврат? и откуда берется [level>0]Вы авторизованы[/level]? и как отображется и где храниться?
  • 0

#3

Поделиться сообщением #3



marker

marker
    Topic Starter
  • Неактивные
  • 52 сообщений
  • Репутация: 0

Отправлено 19 Декабрь 2010 - 16:27

Вопросом на вопрос конечно не очень хорошо, но так как я сам так иногда делаю отвечу:

Это обрабатываются шаблоны, раньше у меня было [admin][/admin][moder][/moder][auth][/auth][no-auth][/no-auth],
но я подумал вот это и есть извращение, а то что я решил сделать, это ни что иное как облегчение кода и нервов.

[level>0]Вы авторизованы[/level]
[level<1>2]Гость, Администратор[/level] или [level=0,3]Гость, Администратор[/level]

Вообще мне бы хотелось не слушать что это извращение а заставить это регулярное выражение работать как надо.
  • 0

#4

Поделиться сообщением #4



surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 19 Декабрь 2010 - 21:06

что это за шаблон такой откуда он берется и где выводится?
  • 0

#5

Поделиться сообщением #5



marker

marker
    Topic Starter
  • Неактивные
  • 52 сообщений
  • Репутация: 0

Отправлено 19 Декабрь 2010 - 21:18

точно могу сказать что выше приведенная строка HTML находиться в переменной $source
и нужно чтобы функция приняла level_blocks('Вы авторизованы','>0')

я вроде достаточно сказал, чтобы мне смогли помочь
  • 0

#6

Поделиться сообщением #6



surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 19 Декабрь 2010 - 21:35

а причем здесь html?
  • 0

#7

Поделиться сообщением #7



marker

marker
    Topic Starter
  • Неактивные
  • 52 сообщений
  • Репутация: 0

Отправлено 19 Декабрь 2010 - 22:12

а зачем вы спросили а зачем здесь html?

задавайте все вопросы в одно сообщение, пожалуйста
  • 0

#8

Поделиться сообщением #8



surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 19 Декабрь 2010 - 23:04

я задал вам их в первом посте, но вы выбрали непонимать, что творите
  • 0

#9

Поделиться сообщением #9



marker

marker
    Topic Starter
  • Неактивные
  • 52 сообщений
  • Репутация: 0

Отправлено 20 Декабрь 2010 - 17:22

Все сделал, правда потратил на это много нервов.

$source = "[level>6]2[level<2]Вы авторизованы[/level]232134[/level]";
$level = 8;

function level_blocks($source, $more=''){

$regexp = "#\\[level([^\]\[]*?)\\]((?:[^[]|(?R))+)\\[/level\\]#";

if(is_array($source)){
$more = $source[1];
$source = $source[2];

preg_match("/<([0-9]+)/i", $more, $under);
$AOpenForU = isset( $under[1] )? intval( $under[1] ) : false;

preg_match("/>([0-9]+)/i", $more, $larger);
$AOpenForL = isset( $larger[1] )? intval( $larger[1] ) : false;
if( ( !$AOpenForL || $AOpenForL > $level ) && ( !$AOpenForU || $AOpenForU < $level ) ){
preg_match($regexp, $source, $output);
if( count( $output ) > 0 ) return preg_replace_callback( $regexp, "level_blocks", $source );
return $source;
}else return '';

return false;
}else{

return preg_replace_callback( $regexp, "level_blocks", $source );

}

}

$source = level_blocks( $source );

print $source;

2232134

  • 0

#10

Поделиться сообщением #10



admin

admin
  • Пользователь PRO
  • 5 275 сообщений
  • Репутация: 55

Отправлено 20 Декабрь 2010 - 17:58

marker, казалось бы несколько трочек кода, а на них потрачено несколько дней :)
Всё приходит с опытом, а нервничать не нужно, это не поможет. Особенно с регулярными выражениями, там нужны спокойствие и внимательность.
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru