PHP中的多字节修剪? [英] Multibyte trim in PHP?
本文介绍了PHP中的多字节修剪?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
显然mb_*
family中没有mb_trim
,所以我正在尝试为自己实现一个。
我最近在php.net中的评论中发现了此正则表达式:
/(^s+)|(s+$)/u
因此,我将通过以下方式实现它:
function multibyte_trim($str)
{
if (!function_exists("mb_trim") || !extension_loaded("mbstring")) {
return preg_replace("/(^s+)|(s+$)/u", "", $str);
} else {
return mb_trim($str);
}
}
正则表达式对我来说似乎是正确的,但我对正则表达式非常陌生。这是否会有效地删除字符串开头/结尾中的任何Unicode空格?
推荐答案
标准trim
函数删除少量空格和类似空格的字符。这些字符被定义为ASCII字符,表示从0
到0100 0000
的特定字节。
正确的UTF-8输入不会包含由字节组成的多字节字符0xxx xxxx
。正确的UTF-8多字节字符中的所有字节都以1xxx xxxx
开头。
这意味着在正确的UTF-8序列中,字节0xxx xxxx
只能引用单字节字符。因此,如果您有一个正确的UTF-8序列,trim
函数将永远不会删除"半个字符"。(非常非常careful about improper UTF-8 sequences。)
s
On ASCII正则表达式将主要匹配与trim
相同的字符。
带有/u
修饰符的preg
函数仅适用于UTF-8编码的正则表达式,并且/s/u
也匹配UTF8的nbsp。这种具有不间断空格的行为是使用它的唯一优势。
如果要替换其他非ASCII兼容编码中的空格字符,这两种方法都不起作用。
换句话说,如果您试图将通常的空格修剪为与ASCII兼容的字符串,只需使用trim
。使用/s/u
时,请注意文本中nbsp的含义。
保重:
$s1 = html_entity_decode(" Hello   "); // the NBSP
$s2 = " 𩸽 exotic test ホ 𩸽 ";
echo "
CORRECT trim: [". trim($s1) ."], [". trim($s2) ."]";
echo "
SAME: [". trim($s1) ."] == [". preg_replace('/^s+|s+$/','',$s1) ."]";
echo "
BUT: [". trim($s1) ."] != [". preg_replace('/^s+|s+$/u','',$s1) ."]";
echo "
!INCORRECT trim: [". trim($s2,'𩸽 ') ."]"; // DANGER! not UTF8 safe!
echo "
SAFE ONLY WITH preg: [".
preg_replace('/^[𩸽s]+|[𩸽s]+$/u', '', $s2) ."]";
这篇关于PHP中的多字节修剪?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文