SyntaxHighlighter BBCode PHP
У меня проблемы с BBCode, который я создал для использования с SyntaxHighlighter
function bb_parse_code($str) {
while (preg_match_all('`\[(code)=?(.*?)\]([\s\S]*)\[/code\]`', $str, $matches)) foreach ($matches[0] as $key => $match) {
list($tag, $param, $innertext) = array($matches[1][$key], $matches[2][$key], $matches[3][$key]);
switch ($tag) {
case 'code': $replacement = '<pre class="brush: '.$param.'">'.str_replace(" ", " ", str_replace(array("<br>", "<br />"), "\n", $innertext))."</pre>"; break;
}
$str = str_replace($match, $replacement, $str);
}
return $str;
}
И у меня есть bbcode:
[b]bold[/b]
[u]underlined[/u]
[code=js]function (lol) {
alert(lol);
}[/code]
[b]bold2[/b]
[code=php]
<? echo 'lol' ?>
[/code]
Который возвращает это:
Я знаю, что проблема на ([\s\S]*)
регулярного выражения, которое допускает любой символ, но как заставить код работать с переносами строк?
1 ответ
Решение
Вы должны использовать следующий шаблон:
`\[(code)=?(.*?)\](.*?)\[/code\]`s
Пара изменений:
- Переключатель на
.*?
сделать квантификатор ленивым. s
модификатор в конце, который вызывает.
чтобы соответствовать новым линиям тоже.