一个字符串拆分多个组合php,php-将字符串拆分为多列(可识别标签)

试图编写这样的功能.它必须将文本分成多列,并且输出必须是有效的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列时,我在第一列中获得未关闭的标签,而在第二列中未打开.如何解决这个问题?需要帮忙!

解决方法:

这是我的解决方案.我想要一些可以识别段落,块引用,表等的代码,因此第二列始终在所有标签关闭后开始.

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 '

Opened Tags: '.$numTags[0].'

';

//echo '

Closed Tags: '.$numTags[1].'

';

//echo '

Unclosed Tags: '.$unclosedTags.'

';

//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("##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 '

Open Tag: <'.$firstOpenTag.'>

';

} 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 '

Final Closing Tag: </'.$firstOpenTag.'>

';

//echo '

Column Break Point: '.$columnBreak.'

';

// 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("##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;

}

标签:split,paragraph,php,tags

来源: https://codeday.me/bug/20191102/1989597.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值