Многострочный 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 являются общими, #
а также ~
(Я также видел !
довольно часто).