题目是:
假设有"123<em>abc</em>456<em>def</em>789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。
要求:
1 <em>和</em>标记不得计算在长度之内。
2 截取后的字符串,要保留原有<em>标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。
示例:
题中的字符串,要截取长度5,则返回的字符串应该为:123ab,要截取长度8,应返回123<em>abc</em>45。
function handleString($htmlTag, $string, $stringLength){
$stringSplitArray = preg_split('/(<'.$htmlTag.'>)(.*?)(<\/'.$htmlTag.'>)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
$bool = false;
foreach ($stringSplitArray as $key => $item){
if ($item == '<'.$htmlTag.'>'){
$data['length'] = strlen($stringSplitArray[$key+1]);
$data['content'] = $stringSplitArray[$key].$stringSplitArray[++$key].$stringSplitArray[++$key];
$datas[] = $data;
$bool = true;
}
if ($bool){
if ($item == '</'.$htmlTag.'>'){
$bool = false;
}else{
continue;
}
} else {
$data['length'] = strlen($item);
$data['content'] = $item;
$datas[]=$data;
}
}
$content = null;
foreach ($datas as $item){
if ($stringLength > $item['length']){
$content .= $item['content'];
$stringLength -= $item['length'];
} elseif ($stringLength == $item['length']){
return $content.$item['content'];
} else {
$stringContent = preg_replace("'<[\/\!]*?[^<>]*?>'si",',$item['content']);
$content .= substr($stringContent, 0, $stringLength);
return $content;
}
}
}
$string = '123<em>abc</em>456<em>def</em>789';
echo handleString('em',$string, 5);