Многострочный PHP BB-код

Я не могу понять, как заставить мой Regex выделять несколько строк, когда я использую

[b]Test[/b]

мой BB-код работает нормально, но когда я пытаюсь

[b]
Test
[/b]

Я прочитал, что я должен использовать модификаторы /s /m в моем регулярном выражении, но я не знаю, как это сделать, я попытался: preg_match_all('\[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]/m/sНо это не работает.

Какие-либо предложения?

Рабочий пример:

$tags = 'b|i|size|color|center|quote|url|img';
while (preg_match_all('`\[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]`', $string, $matches))
    foreach ($matches[0] as $key => $match) {
        list($tag, $param, $innertext) = array($matches[1][$key], $matches[2][$key], $matches[3][$key]);

1 ответ

Решение

Ваш синтаксис для добавления модификаторов неверен. Во-первых, вам не нужно использовать косые черты для их применения. Они просто принадлежат после разделителя (который в вашем случае не / но `). А также вам не нужно снова разграничивать каждый модификатор, просто соедините их вместе:

'`\[(' . $tags . ')=?(.*?)\](.+?)\[/\1\]`ms'

Какой разделитель вы используете, не имеет значения вообще. Проверьте PHP документацию по разделителям. Ты можешь использовать

любой не буквенно-цифровой символ без обратной косой черты, без пробелов.

Только будьте осторожны, что разделитель должен быть экранирован. Так что нет разницы между ` а также / совсем. Просто если вы используете / вместо этого вам нужно сбежать / внутри регулярного выражения (в противном случае PHP будет считать, что это конец регулярного выражения). Как это:

'/\[(' . $tags . ')=?(.*?)\](.+?)\[\/\1\]/ms'

Поэтому выбор разделителя в большинстве случаев удобен - используйте тот, который не встречается в регулярном выражении, если это возможно, поэтому вам не нужно избегать его. / это просто самый распространенный выбор, поэтому вы, вероятно, нашли /m запись для добавления модификаторов. Поскольку состояния документации PHP являются общими, # а также ~ (Я также видел ! довольно часто).

Другие вопросы по тегам