Здравствуйте.
Есть такая регулярка '~\[b]\s*(.+?)\s*\[/b]~s'
- что стоит изменить в ней, чтобы она не срабатывала, когда в тексте есть только пробелы и переносы строк?
Общее решение подобных задач включает в себя исключающий блок предварительного просмотра вперёд:
'~\[b](?!\s*\[/b])\s*(.+?)\s*\[/b]~'
См. демо регулярного выражения. Однако для парсинга BB-кодов существуют специальные библиотеки (например, jBBCode).
Подробности
\[b]
- подстрока [b]
(?!\s*\[/b])
- после текущей позиции не должно быть 0+ пробельных символов, после которых следует подстрока [/b]
\s*
- 0+ пробельных символов(.+?)
- 1 и более символов (как можно больше)\s*
- 0+ пробельных символов\[/b]
- подстрока [/b]
Вам нужна такая запись (публикую два варианта решения):
$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]
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем здравствуйте! Следующая задачаЕсть неважно какой xml файл, но будем рассматривать на примере этого:
Я пытаюсь использовать Payum для приёма платежей на сайте