Мой общий сервер недавно обновился до php5.4, что нарушило код PEAR HTMLBB.

Я попытался написать небольшую функцию для замены парсера какого-нибудь простого bb-кода на код, который я нашел на нескольких форумах.

Код bbcode, который я хочу проанализировать, включает такие теги, как тег изображения с атрибутами:

[img src="" h="" w="" alt=""]
[*] //for bulleted lists


Поскольку мои знания о регулярных выражениях ограничены, может быть, кто-нибудь сможет объяснить, как добавлять атрибуты к строкам img? Я предполагаю, что @ предназначен для подавления ошибок из preg_replace ()?

Как бы вы поступили с этим тегом [*]?

// original function
function bbCode($string) {
    $search = array(    
        '@\[(?i)img\](.*?)\[/(?i)img\]@si',
        '@\[url\s*=\s*(.*?)\s*\](.*?)\[\/url\]@si'
    );
    $replace = array(
        '<img src="\\1">',
        '<a href="\\1">\\2</a>'
    );
    return preg_replace($search , $replace, $string);
}


// test
function bbCode($string) {
    $search = array(    
        '@\[img\s*=\s*(.*?)\s*\
         \s*=[(0-9)+]
         \s*=[(0-9)+]
         \s*=\s*(.*?)\s*\]
         (.*?)\[\/img\]@si',
        '[*]'
    );
    $replace = array(
        '<img src="\\1" height="\\2" width="\\3" alt="\\4">',
        '<li></li>'
    );
    return preg_replace($search , $replace, $string);
}
0
rrrfusco 3 Май 2014 в 03:09

2 ответа

Лучший ответ

Регулярное выражение, необходимое для решения этих проблем, требует более внимательного изучения. Библиотека PEAR bbcode уже на много шагов впереди в этом направлении.

Хотя с библиотекой PEAR все еще есть небольшие проблемы, она все же лучше, чем то, что мы пытались здесь сделать.

Я добавил путь в php.ini, и он по какой-то причине вернул ошибки

require "/path/to/pear";

Служба поддержки моего хоста смогла исправить ссылку, просто

include "../path/to/pear_bbcode";
0
rrrfusco 25 Июн 2014 в 04:37

Квадратные скобки - это специальные символы в регулярных выражениях, используемых для создания групп. Звездочка также является директивой регулярного выражения. Оба должны быть экранированы, если вы пытаетесь сопоставить буквальное содержание. Вы хотели бы изменить свой тестовый код на что-то вроде этого. Но не забудьте проверить свое предложение, так как я делаю это без промедления и не подтверждаю его предварительно.

// test
function bbCode($string) {
    $search = array(    
        '@\[img\s*=\s*(.*?)\s*\
         \s*=[(0-9)+]
         \s*=[(0-9)+]
         \s*=\s*(.*?)\s*\]
         (.*?)\[\/img\]@si',
        '\[\*\]'
    );
    $replace = array(
        '<img src="\\1" height="\\2" width="\\3" alt="\\4">',
        '<li></li>'
    );
    return preg_replace($search , $replace, $string);
}
0
Peter Lange 3 Май 2014 в 00:10