preg_replace все, кроме содержимого в bbcode

Я пытаюсь заменить все в своем контенте пустым пространством, кроме контента в моем bbcode (и самого bbcode).

Это мой код для устранения моего bbcode. BBCode — это всего лишь небольшой помощник для определения важного контента.

$content = preg_replace ( '/\[lang_chooser\](.*?)\[\/lang_chooser\]/is' , '$1' , $content );

Нельзя ли просто отменить этот код?

$content = preg_replace ( '/^[\[lang_chooser\](.*?)\[\/lang_chooser\]]/is' , '' , $content );

Ура и спасибо за вашу помощь!

ИЗМЕНИТЬ вот мое решение (извините, в данный момент я не могу ответить на свой вопрос)

$firstOcc = stripos($content, '[lang_chooser]');
$lastOcc = stripos($content, '[/lang_chooser]');
$content = substr($content, $firstOcc, $lastOcc + strlen('[/lang_chooser]') - $firstOcc);
$content = preg_replace('/' . addcslashes('[lang_chooser](.*?)[/lang_chooser]', '/[]') . '/is', '$1', $content);

Я думаю, что это не лучшее решение, но на данный момент оно работает. Может быть, есть лучший способ сделать это ;-)


person pixel-shock    schedule 03.08.2012    source источник
comment
Вы посмотрели на preg_match, как я предложил? Я думаю, что это более правильно, чем то, что у вас есть сейчас. Кроме того, ваш вопрос, кажется, указывает на то, что вы хотите сохранить bbcode... ваше решение отбрасывает его. Кроме того, если вы уже используете подстроку для получения части своей строки, какой цели служит preg_replace? Регулярные выражения существуют, чтобы упростить поиск смещений в строках...   -  person    schedule 06.08.2012


Ответы (1)


Символ ^ не отрицает, кроме как в классах символов. Это означает совпадение с началом строки (или строки, если вы находитесь в многострочном режиме).

Можно иметь отрицательный взгляд вперед и назад, но я думаю, что нельзя отрицать все регулярные выражения.

Если вы просто хотите заменить строку частью этой строки, используйте preg_match и назначьте массив совпадений вашему тексту.

if( preg_match ( '/(\[lang_chooser\].*?\[\/lang_chooser\])/is', $content, $matches ) )

    echo $matches[ 0 ]; // should have what you want

Для удобства чтения я использую addcslashes, чтобы избежать / и [:

if( preg_match ( '/' . addcslashes( '([lang_chooser].*?[/lang_chooser])', '/[]' ) . '/is', $content, $matches ) )

Лучшая часть addcslashes заключается в том, что вы можете взять любое регулярное выражение (из переменной, из значения окна поиска, из конфигурации) и безопасно вызывать preg-функции, не беспокоясь о том, какой разделитель использовать.

Вероятно, вам также нужен модификатор u для соответствия юникоду, если только по какой-то странной причине вы не используете utf-8:

if( preg_match ( '/' . addcslashes( '([lang_chooser].*?[/lang_chooser])', '/[]' ) . '/isu', $content, $matches ) )

В то же время я немного улучшил подход addlashes. Это позволяет использовать строковые литералы в регулярных выражениях, не беспокоясь о метасимволах. Xeoncross указал на preg_quote. Было бы неплохо иметь такой escape-класс, чтобы вы могли взять откуда-нибудь фиксированный разделитель, чтобы ваш код был более аккуратным. Кроме того, в какой-то момент вы можете захотеть добавить другие разновидности регулярных выражений или иметь возможность отслеживать будущие изменения в preg_quote без изменения остальной части вашей кодовой базы. В настоящее время поддерживает только pcre:

class Escape
{
    /*
     * escapes meta characters in strings in order to put them in regular expressions
     * 
     * usage:
     * pcre_replace( '/' . Escape::pcre( $text ) . '/u', $string );
     * 
     */

    static
    function pcre( $string )
    {
        return

            preg_quote( $string, '/' )

        ;
    }
}
person Community    schedule 03.08.2012
comment
Привет, хммм ... хорошо, я думал, что можно отменить целое регулярное выражение. Вы знаете другой способ решить мою проблему? Возможно, мне нужно объяснить, что я хочу сделать: у меня есть один контент для двух страниц, на первой странице я должен отображать только язык Chooser, а на второй странице я должен отображать только другой контент. Звучит избито, я знаю ;-) - person pixel-shock; 03.08.2012
comment
СПАСИБО ЗА ВАШ СОВЕТ С аддслэшами ;) - person pixel-shock; 03.08.2012
comment
Почему вы не использовали preg_quote()? - person Xeoncross; 10.08.2012
comment
@Xeoncross Вы абсолютно правы. Я не знал об этой функции ... Я обновлю ответ. - person ; 10.08.2012