2011-09-16 3 views
3

이러한 기능을 쓰려고합니다. 텍스트를 여러 열로 나누어야하며 출력은 유효한 html이어야합니다. 미개봉 (!!!) 닫기 태그 및 닫힌 태그가 없습니다. 여기 내 코드입니다 :문자열을 여러 열로 분할 (태그 인식)

function convert2columns($content = '', $columns = 2) { 
$result = array(); 
$content = closetags($content); 
$bodytext = array("$content"); 
$text = implode(",", $bodytext); 
$length = strlen($text); 
$length = ceil($length/$columns); 
$words = explode(" ", $text);  
$c = count($words); 
$l = 0; 
for ($i = 1; $i <= $columns; $i++) { 
    $new_string = ""; 
    for ($g = $l; $g <= $c; $g++) { 
     if (strlen($new_string) <= $length || $i == $columns) {    
if (in_array(substr(@$words[$g], $length - 1, 1), array(' ', '.', '!', '?'))) 
       $new_string .= @$words[$g] . " "; 
      else { 
       $split = substr(@$words[$g], 0, $length - 1); 
       $lastSpace = strrpos($split, ' '); 
       if ($lastSpace !== false) { 
        $split = substr($split, 0, $lastSpace); 
       } 
       if (in_array(substr($split, -1, 1), array(','))) { 
        $split = substr($split, 0, -1); 
       } 
       $new_string .= $split . " "; 
      } 
     } else { 
      $l = $g; 
      break; 
     } 
    } 
    $result[] = $new_string; 
} 
return $result; 
} 

작동하지만, 2 열에 텍스트를 분할하려고 할 때, 나는 닫히지 않은 태그 첫 번째 열에 및 초에 개봉을 얻을. 이 문제를 해결하는 방법? 도움이 필요하다!

+0

언제든지 문자열 함수 (또는 정규식)를 사용하여 HTML로 _anything_을 수행하면 문제가 발생할 수 있습니다. 즉, 얻은 것과 뭘 원하는지에 대한 견본 출력이 도움이 될 것입니다. :) – Herbert

+0

closetags()는 무엇을합니까? 방법을 보여줄 수 있습니까? – Chris

+0

안녕하세요, Zhlobopotam. 나는 방금 같은 문제에 대한 작업을 시작했고 도움이된다면 내 최종 솔루션을 공유하게되어 기쁘다. @ 크리스가 말했듯이 - closetags()는 무엇을합니까? – BaronGrivet

답변

4

여기 내 해결책이 있습니다. 나는 paragraph, blockquotes, tables 등을 인식 할 수있는 코드를 원했다. 그래서 모든 태그가 닫힌 후에 두번째 컬럼이 항상 시작된다.

function ContentToTwoColumns($fullContent){ 
    //Get character length of content 
    $fullContentLength = strlen($fullContent); 
    //Set the ratio of column size 
    $column1Percent = .55; 
    $column2Percent = .45; 

    //Break the content into two columns using the ratios given. 
    $columnsContent = array(); 
    $columnBreak = round($column1Percent * $fullContentLength); 
    $columnsContent[0] = substr($fullContent, 0, $columnBreak); 
    $columnsContent[1] = substr($fullContent, $columnBreak); 

    //Check for unclosed tags in the first column by comparing 
    //the number of open tags with closed tags. 
    $numTags = countOpenClosedTags($columnsContent[0]); 
    $numOpened = $numTags[0]; 
    $numClosed = $numTags[1]; 
    $unclosedTags = $numOpened - $numClosed; 

    //echo '<p>Opened Tags: '.$numTags[0].'</p>'; 
    //echo '<p>Closed Tags: '.$numTags[1].'</p>'; 
    //echo '<p>Unclosed Tags: '.$unclosedTags.'</p>'; 

    //If there are unclosed tags recalculate the column break. 
    if($unclosedTags > 0){ 

    //Return the identity of all open tags in the first column. 
    preg_match_all("#<([a-z]+)(.*)?(?!/)>#iU", $columnsContent[0], $result); 
    $openedTags = $result[1]; 

    //Return the identity of all closed tags in the first column. 
    preg_match_all("#</([a-z]+)>#iU", $columnsContent[0], $result); 
    $closedTags = $result[1]; 

    //Reverse array of open tags so they can be matched against the closed tags. 
    $openedTags = array_reverse($openedTags); 

    //Loop through open/closed tags to identify first unclosed tag 
    //in first column on content. 
    for($i = 0; $i < $numOpened; $i++){ 
     if (!in_array ($openedTags[$i], $closedTags)){ 
     $firstOpenTag = $openedTags[$i]; 
     //echo '<p>Open Tag: &lt;'.$firstOpenTag.'&gt;</p>'; 
     } else { 
     unset ($closedTags[array_search ($openedTags[$i], $closedTags)]); 
     } 
    } 

    //Get name of first open tag and create a closed version. 
    //$firstOpenTag = $openedTags[$tagNum][0]; 
    $firstOpenTagClosed = '</'.$firstOpenTag.'>'; 

    //Calculate the tag length of the closed version. 
    $tagLength = strlen($firstOpenTagClosed); 

    //Locate the position of the first closed tag in the second column 
    //content that matches the first opened tag in the first column 
    $positionCloseTag = strpos($columnsContent[1], $firstOpenTagClosed); 

    //Calculate the position of the new column break using the 
    //position of and length the final closing tag. 
    $columnBreak = $columnBreak + $positionCloseTag + $tagLength; 

    //echo '<p>Final Closing Tag: &lt;/'.$firstOpenTag.'&gt;</p>'; 
    //echo '<p>Column Break Point: '.$columnBreak.'</p>'; 

    // Break the content into two columns using the new break point. 
    $columnsContent[0] = substr($fullContent, 0, $columnBreak); 
    $columnsContent[1] = substr($fullContent, $columnBreak); 
    } 

    // Return the two columns as an array 
    return $columnsContent; 
} 

function countOpenClosedTags($html){ 
    //Return the identity and position of all open tags in the HTML. 
    preg_match_all("#<([a-z]+)(.*)?(?!/)>#iU", $html, $result, PREG_OFFSET_CAPTURE); 

    //Check that the returned result array isn't empty. 
    if (!isset($result[1])){ 
    $numOpened = 0; 
    } else { 
    //If the result array isn't empty get the number of open tags. 
    $openedTags = $result[1]; 
    $numOpened = (!$openedTags) ? 0 : count($openedTags); 
    } 

    //Return the identity and position of all close tags in the HTML. 
    preg_match_all("#</([a-z]+)>#iU", $html, $result, PREG_OFFSET_CAPTURE); 

    //Check that the returned result array isn't empty. 
    if (!isset($result[1])){ 
    $numClosed = 0; 
    } else { 
    //If the result array isn't empty get the number of close tags. 
    $closedTags = $result[1]; 
    $numClosed = (!$closedTags) ? 0 : count($closedTags); 
    } 

    //Create an array to return the open and close counts. 
    $numTags = array($numOpened, $numClosed); 
    return $numTags; 
} 
관련 문제