Ошибка при преобразовании доски объявлений

Я скопировал этот текст из документов PHP ( PHP: bbcode_create ) и изменил его для быстрого использования для BB-кодов. Но всякий раз, когда есть разрыв строки между двумя BB-кодами, например. между [b] а также [/b] это не преобразует код.

Вот код, который я использовал:

function bb_codes($string) {
$tags = 'b|i|size|color|center|quote|url|img|li|list|s';
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 's': $replacement = "<strike>$innertext</strike>"; break;
case 'i': $replacement = "<em>$innertext</em>"; break;
case 'size': $replacement = "<span style=\"font-size: $param;\">$innertext</span>"; break;
case 'list': if(!empty($param)){ $replacement = "<ol>$innertext</ol>"; } else{ $replacement = "<ul>$innertext</ul>"; } break;
case 'li': $replacement = "<li>$innertext</li>"; break;
case 'color': $replacement = "<span style=\"color: $param;\">$innertext</span>"; break;
case 'center': $replacement = "<div class=\"centered\">$innertext</div>"; break;
case 'quote': $replacement = "<blockquote>$innertext</blockquote>" . $param? "<cite>$param</cite>" : ''; break;
case 'url': $replacement = '<a href="' . ($param? $param : $innertext) . "\">$innertext</a>"; break;
case 'img':
list($width, $height) = preg_split('`[Xx]`', $param);
$replacement = "<img src=\"$innertext\" " . (is_numeric($width)? "width=\"$width\" " : '') . (is_numeric($height)? "height=\"$height\" " : '') . '/>';
break;
case 'video':
$videourl = parse_url($innertext);
parse_str($videourl['query'], $videoquery);
if (strpos($videourl['host'], 'youtube.com') !== FALSE) $replacement = '<embed src="http://www.youtube.com/v/' . $videoquery['v'] . '" type="application/x-shockwave-flash" width="425" height="344"></embed>';
if (strpos($videourl['host'], 'google.com') !== FALSE) $replacement = '<embed src="http://video.google.com/googleplayer.swf?docid=' . $videoquery['docid'] . '" width="400" height="326" type="application/x-shockwave-flash"></embed>';
break;
}
$string = str_replace($match, $replacement, $string);
}
return $string;
}

Заранее спасибо!

П.С .: Я редактировал s, list а также li только!

0

Решение

Проблема в том, что в стандартном (то есть без модификаторов) регулярном выражении . Метасимвол не соответствует разрывам строк. Решение этой проблемы заключается в использовании s модификатор, который марки это соответствует разрывам строк, поэтому вместо

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

в preg_match_all в строке 3 используйте это:

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector