Разделить серию параграфов по абзацам на основе strcount - PullRequest
1 голос
/ 01 ноября 2011

У меня уникальная ситуация ... Мне нужно взять строку длиной более 12 000 символов и разделить ее на 1000 сегментов. Хитрость в том, что мне нужно избегать нарушения параграфов. Мне интересно, если preg_match_all может быть лучшим решением. В настоящее время я использую простой str_split () по количеству символов. Мне нужно разделить теги абзаца <p></p>

Кто-нибудь делал это раньше? Можете ли вы предложить мне какие-либо советы о том, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2011

Простой способ (при условии, что абзацы разделены новыми строками).

Сначала разбейте абзацы, а затем объедините вместе.

ПРИМЕЧАНИЕ. - Этот пример был написан до того, как абзацы 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, а не текстом.

Основная предпосылка все еще работает - разбейте абзацы, объединитеони вместе.
Лучше всего разбивать абзацы HTML, используя dom-парсер.

0 голосов
/ 01 ноября 2011

Используя PHP DOMDocument ( docs ), вы можете анализировать HTML-код и затем зацикливать каждый абзац, выполняя любое усечение, которое вам потребуется.

В приведенном ниже примере кода я предполагаю, что вы захотите удалить все теги HTML из текста абзаца, прежде чем ограничить текст 1000 символами. В противном случае теги HTML будут считаться символами, и в результате вы получите менее 1000 читаемых символов.

   // 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...