function bb_parse($string, $tags = 'b|i|u|quote|url|img|youtube|user') {
$replacement = 0;
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]);
switch ($tag) {
case 'b': $replacement = '<strong>'.$innertext.'</strong>'; break;
case 'i': $replacement = '<em>'.$innertext.'</em>'; break;
case 'u': $replacement = '<span style="text-decoration: underline;">'.$innertext.'</span>'; break;
case 'quote': $replacement = '<div class="quote"><div class="quote-author">'.($param ? 'Quote by: '.$param : 'Quote').'</div>'.$innertext.'</div>'; break;
case 'url': $replacement = '<a href="'.($param ? $param : $innertext).'">'.$innertext.'</a>'; break;
case 'user': $replacement = '<a href="'.url('user/'.($param ? $param : $innertext)).'">'.$innertext.'</a>'; break;
case 'img': $replacement = '<img src="'.$innertext.'" style="max-width: 640px;"/>'; break;
case 'youtube':
$videourl = parse_url($innertext);
parse_str($videourl['query'], $videoquery);
if (strpos($videourl['host'], 'youtube.com') !== FALSE) $replacement = '<div><iframe width="755" height="425" src="http://www.youtube.com/embed/'.$videoquery['v'].'" frameborder="0" allowfullscreen></iframe></div>';
break;
}
$string = str_replace($match, $replacement, $string);
}
return $string;
}
例如,如果我使用[quote]和换行符,它会输出:
[quote]This is {LINEBREAK}
a test[/quote]
这不应该是
<div class="quote"><div class="quote-author">Quote</div>This is {LINEBREAK}
a test</div>
有人有想法吗?
答案 0 :(得分:0)
您可以使用RegEx上的s
修饰符来指示“单线模式”。默认情况下,点(.
)与新行字符不匹配。使用s
修饰符,确实如此。
preg_match_all('`\[('.$tags.')=?(.*?)\](.+?)\[/\1\]`s', $string, $matches)