如何用PHP拆分长字符串?

时间:2009-09-03 09:57:22

标签: php

我目前正在寻找拆分可能包含HTML特征的非常长的字符串。

一旦例子是:

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。

任何帮助都会很棒。

谢谢

4 个答案:

答案 0 :(得分:2)

考虑使用内置的wordwrap()代替?

答案 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

关于代码点的问题 - 您可能希望查看html_entity_decode,我认为将代码点(例如&#223)转换为它们所代表的字符。你需要给它一个字符集,因此它知道223意味着什么(因为'223'意味着取决于字符集)。

答案 2 :(得分:0)

我使用this函数在FireStats中拆分字符串。

你可以把它从背景中删除并轻松使用它。请注意,它正在调用其他一些功能。如果你愿意,你可以跳过utf8检查。

答案 3 :(得分:0)

摆脱这种复杂性,使用DOM parser提取纯文本

//Dump contents (without tags) from HTML
$pageText = file_get_html('http://www.google.com/')->plaintext;
echo "Length is: " . strlen($pageText);