我目前正在寻找拆分可能包含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äää
我一直试图弄清楚如何拆分上面的字符串,不计算HTML标记中的字符数,并将每个ASCII字符计为1。
任何帮助都会很棒。
谢谢
答案 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;
}
关于代码点的问题 - 您可能希望查看html_entity_decode
,我认为将代码点(例如ß
)转换为它们所代表的字符。你需要给它一个字符集,因此它知道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);