Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Регулярное выражение, непустой BB-код

#php #регулярные_выражения


Здравствуйте.

Есть такая регулярка '~\[b]\s*(.+?)\s*\[/b]~s' - что стоит изменить в ней, чтобы
она не срабатывала, когда в тексте есть только  пробелы и переносы строк?
    


Ответы

Ответ 1



Общее решение подобных задач включает в себя исключающий блок предварительного просмотра вперёд: '~\[b](?!\s*\[/b])\s*(.+?)\s*\[/b]~' См. демо регулярного выражения. Однако для парсинга BB-кодов существуют специальные библиотеки (например, jBBCode). Подробности \[b] - подстрока [b] (?!\s*\[/b]) - после текущей позиции не должно быть 0+ пробельных символов, после которых следует подстрока [/b] \s* - 0+ пробельных символов (.+?) - 1 и более символов (как можно больше) \s* - 0+ пробельных символов \[/b] - подстрока [/b]

Ответ 2



Вам нужна такая запись (публикую два варианта решения): ', print_r($a[0], true), '
'; echo preg_replace_callback( '~\[b]\s*(\S)?(?(1)[\w\s!?:;,.-]+|\S+)\[/b]~u', function ($a) { $a = preg_replace(['~\[/?b]~', '~\s+~'], ['', ' '], $a[0]); return '' . $a . ''; }, $str ); Результат: Совпадений: 3 Array ( [0] => [b]Текст! Текст![/b] [1] => [b] Текст ,[/b] [2] => [b] Текст ? Текст -- [/b] ) Текст! Текст! Текст , Текст ? Текст -- [b] [/b] [b] [/b] [b][/b]

Комментариев нет:

Отправить комментарий