我有一个独特的情况......我需要一个12,000+字符串并将其分成1,000个字符段。诀窍是,我需要避免打破段落。我想知道preg_match_all是否是最好的解决方案。目前我正在使用简单的str_split()字符数。我需要通过段落标记<p></p>
以前有人这样做过吗?你能告诉我如何实现这个目标吗?
答案 0 :(得分:0)
使用PHP的DOMDocument
(docs),你可以解析HTML然后循环每个段落,做你需要做的任何截断。
在下面的示例代码中,我假设您要在将文本限制为1,000个字符之前从段落文本中删除任何HTML标记 - 否则,HTML标记将计为字符,您最终会少于1,000个可读字符。
// create a new DOMDocument
$doc = new DOMDocument();
// load the string into the DOM (this is your 12,000 character string)
$doc->loadHTML('<p>Paragraph text</p><p>Paragraph text</p><p>Paragraph text</p><p>Paragraph text</p>');
$paragraph_fragments = array();
//Loop through each <p> tag in the dom and do... things to it
foreach($doc->getElementsByTagName('p') as $paragraph) {
// get the node's text, remove excess space and any internal HTML tags
$text = strip_tags(trim($paragraph->nodeValue));
// get the first 1000 characters from the string
array_push($paragraph_fragments, substr($text, 0, 1000));
}
print_r($paragraph_fragments);
答案 1 :(得分:0)
简单方法(假设段落由新行分隔)。
首先分解成段然后连在一起。
注意 - 此示例是在问题
中指定HTML段落之前编写的$hugeText = "..."
$paragraphSep = "\n"
$paragraphs = explode($paragraphSep, $hugeText);
$chunks = array();
$curChunk = '';
foreach ($paragraphs as $paragraph)
{
// if it's ok to go over
$curChunk .= $paragraphSep . $paragraph;
if (strlen($curChunk) >= 1000)
{
$chunks []= $curChunk;
$curChunk = '';
}
// if it's not ok to go over
if (strlen($curChunk) + strlen($paragraphSep) + strlen($paragraph) >= 1000)
{
$chunks []= $curChunk;
$curChunk = $paragraph;
}
else
{
$curChunk .= $paragraphSep . $paragraph;
}
}
编辑:由于段落现在是HTML而不是文字。
基本前提仍然有效 - 拆分段落,将它们合并在一起。
最好使用dom解析器拆分html段落。