2016-06-14 23 views
0

이 텍스트를 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, listli 만 편집했습니다.

답변

0

정규식 (즉, 수정 자 없음) 정규 표현식에서 . 메타 문자는 줄 바꿈을 일치시키지 않는 것이 문제입니다. 이에 대한 해결책은 라인 3 그래서 대신 preg_match_all

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

의, 이 일치 줄 바꿈을하게 s 수정을 사용하는 것입니다, 이것을 사용 :

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