基于strcount的段落分割系列

时间:2011-11-01 18:17:49

标签: php regex string

我有一个独特的情况......我需要一个12,000+字符串并将其分成1,000个字符段。诀窍是,我需要避免打破段落。我想知道preg_match_all是否是最好的解决方案。目前我正在使用简单的str_split()字符数。我需要通过段落标记<p></p>

进行拆分

以前有人这样做过吗?你能告诉我如何实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

使用PHP的DOMDocumentdocs),你可以解析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段落。