2009-09-03 3 views
4

В настоящее время я изучаю разделение очень длинной строки, которая может содержать характеристики HTML.Как разбить длинную строку на PHP?

После примера:

Thiiiissssaaaveryyyylonnngggstringgg 

Для этого я использовал эту функцию в прошлом:

function split($sString, $iCount = 75) 
{  
    $text = $sString; 
    $new_text = ''; 
    $text_1 = explode('>',$text); 
    $sizeof = sizeof($text_1); 
    for ($i=0; $i<$sizeof; ++$i) { 
     $text_2 = explode('<',$text_1[$i]); 
     if (!empty($text_2[0])) { 

       $new_text .= preg_replace('#([^\n\r .]{'. $iCount .'})#iu', '\\1 ', $text_2[0]); 
     } 
     if (!empty($text_2[1])) { 
      $new_text .= '<' . $text_2[1] . '>'; 
     } 
    } 
    return $new_text; } 

Функция работает, чтобы подобрать такие символы и разделить их после того, как X символов. Проблема заключается в том, когда HTML или ASCII символы смешиваются там, как это:

Thissssiisss<a href="#">lonnnggg</a>sting&#228;&#228;&#228; 

Я пытался выяснить, как разделить эту строку выше и не сосчитать символы в HTML-теги и считать каждый ASCII символ как 1.

Любая помощь будет отличной.

Спасибо

ответ

2

Если вы беспокоитесь о поддержке UTF-8 для wordwrap, то вы хотите:

function utf8_wordwrap($str, $width = 75, $break = "\n") // wordwrap() with utf-8 support { 
    $str = preg_split('#[\s\n\r]+#', $str); 
    $len = 0; 
    foreach ($str as $val) { 
     $val .= ' '; 
     $tmp = mb_strlen($val, 'utf-8'); 
     $len += $tmp; 
     if ($len >= $width) { 
      $return .= $break . $val; 
      $len = $tmp; 
     } 
     else { 
      $return .= $val; 
     } 
    } 
    return $return; 
} 

PHP Manual Comment

Что касается вашей проблемы с кодовыми точками - вы можете посмотреть на html_entity_decode, который, я думаю, преобразует кодовые точки (например, &#223) персонажу, который они представляют. Вам нужно будет дать ему набор символов, чтобы он знал, что означает 223 (поскольку значение «223» зависит от кодировки).

+0

Спасибо за отзыв о "html_entity_decode". Я использовал эту функцию и включил ее в то, над чем работал, и, похоже, работает отлично. Еще раз спасибо! –

+0

@Patrik Johansson - рад, что это сработало для вас :) –

2

Рассмотрим с помощью встроенного в wordwrap() вместо этого?

+0

проблема с wordwrap заключается в том, что она может разбить строку в середине ширины char utf8 (рендеринга строки invalid utf8) или в середине элемента html, например &nsbp;, испортить его. –

+0

@omry, см. Мой ответ –

0

Я использую функцию this для разделения строк в FireStats.

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

0

Избавиться от этой сложности, использовать DOM parser для извлечения обычный текстовый

//Dump contents (without tags) from HTML 
$pageText = file_get_html('http://www.google.com/')->plaintext; 
echo "Length is: " . strlen($pageText); 
Смежные вопросы