Preg_match_all bbcode неправильно работает
Долго мучаюсь с bb кодами вида:
[show=home,category] Тут код простой, но внутри может быть повторение тегов, например: [show=home,category]этот текст должен выводится только в категориях[/show] и т.д.[/show]
На локалке срабатывает нормально, на сервере почему-то все исчезает, белая страница.
Сам код:
function tagShow( $matches ) {
$regex = '/\[(show|not-show)=(.*?)\]((?>(?R)|.)*?)\[\/\1\]/is';
if (is_array($matches)) {
$pageType = $matches[2];
$block = $matches[3];
if ($matches[1] == "show") $action = true; else $action = false;
$pages = explode(',', $pageType);
if($action) { // показываем
if(in_array($this->route["controller"], $pages)) $matches = $block; else $matches = '';
} else { // не показываем
if(in_array($this->route["controller"], $pages)) $matches = ''; else $matches = $block;
}
}
return preg_replace_callback($regex, array( &$this, 'tagShow'), $matches);
}
Ответы (2 шт):
Чтобы видЕть ошибки вместо белой страницы, нужно прописать где-то в самом "верху" (с учетом импортов):
<?php
error_reporting(E_ALL);
?>
Теги же регулярками парсить такая себе идея... Лучше с помощью рекурсивного спуска все сделать
Возможно, на сервере возникает ошибка, которая вызывает белую страницу. Это могут быть ошибки синтаксиса, логики, исчерпание памяти PHP, и т. д. Чтобы увидеть эти ошибки, я бы рекомендовал вам включить отображение ошибок в PHP на сервере, добавив в начало вашего PHP-скрипта следующие строки:
php
error_reporting(E_ALL);
ini_set('display_errors', 1);
Это позволит отображать все ошибки в коде, так что вы сможете увидеть, что именно вызывает белую страницу, и исправить проблему.
Из кода, который вы предоставили, я не вижу явных ошибок, но есть несколько вещей, которые стоит проверить:
- Проверьте, правильно ли определена переменная
$this->route["controller"]. - Убедитесь, что исходный текст передается в функцию
tagShowв качестве параметра$matches. - Попробуйте увеличить лимит памяти PHP на сервере, если обработка bb-кодов занимает много памяти.