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

298
01 ноября 2017, 04:15

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

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

Answer 1

Общее решение подобных задач включает в себя исключающий блок предварительного просмотра вперёд:

'~\[b](?!\s*\[/b])\s*(.+?)\s*\[/b]~'

См. демо регулярного выражения. Однако для парсинга BB-кодов существуют специальные библиотеки (например, jBBCode).

Подробности

  • \[b] - подстрока [b]
  • (?!\s*\[/b]) - после текущей позиции не должно быть 0+ пробельных символов, после которых следует подстрока [/b]
  • \s* - 0+ пробельных символов
  • (.+?) - 1 и более символов (как можно больше)
  • \s* - 0+ пробельных символов
  • \[/b] - подстрока [/b]
Answer 2

Вам нужна такая запись (публикую два варианта решения):

$str = "[b]text[/b]
[b] 
text [/b]
[b]     text 
text2   [/b]  [b]      [/b]
[b]     
 [/b]
[b][/b]";
$patt = '~\[b]\s*(\S)?(?(1)[\w\s]+|\S+)\[/b]~';
$all = preg_match_all($patt, $str , $a);
echo 'Совпадений: '. $all, '<pre>', print_r($a[0], true), '</pre>';

echo preg_replace_callback(
    '~\[b]\s*(\S)?(?(1)[\w\s]+|\S+)\[/b]~', 
    function ($a) {
        $a = preg_replace(['~\[/?b]~', '~\s+~'], ['', ' '], $a[0]);
        return '<b>' . $a . '</b>';
    },
    $str
);

Результат:

Совпадений: 3
Array
(
    [0] => [b]text[/b]
    [1] => [b] 
text [/b]
    [2] => [b]  text 
text2   [/b]
)

text text text text2 [b] [/b] [b] [/b] [b][/b]

READ ALSO
Как правильно построить отношение Laravel

Как правильно построить отношение Laravel

Упрощенная структура (основные поля для понимания):

311
Рекурсивный обход xml средствами php

Рекурсивный обход xml средствами php

Всем здравствуйте! Следующая задачаЕсть неважно какой xml файл, но будем рассматривать на примере этого:

1081
Payum: установить свой url для capture

Payum: установить свой url для capture

Я пытаюсь использовать Payum для приёма платежей на сайте

292