2009-09-03 44 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

如果你擔心爲wordwrap UTF-8支持,那麼你想這樣的:

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

至於你的codepoints問題 - 你可能想看看html_entity_decode,我認爲它轉換碼點(例如&#223)轉換爲它們所代表的字符。你需要給它一個字符集,以便它知道223意味着什麼(因爲'223'的含義取決於字符集)。

+0

感謝您對「html_entity_decode」的提示。我使用了該功能,並將其與我正在工作的內容一起使用,並且它看起來很完美。再次感謝! – 2009-09-03 10:51:18

+0

@Patrik Johansson - 很高興爲你工作:) – 2009-09-03 10:52:09

2

考慮使用內置wordwrap()呢?

+0

wordwrap的問題在於,它可能會在utf8寬字符(呈現字符串無效utf8)或像HTML元素(如&nsbp;)中間破壞行,將其搞亂。 – 2009-09-03 10:06:17

+0

@omry,看我的回答 – 2009-09-03 10:14:24

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);