PHP中的多字节修剪? [英] Multibyte trim in PHP?

查看:57
本文介绍了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字符,表示从00100 0000的特定字节

正确的UTF-8输入不会包含由字节组成的多字节字符0xxx xxxx。正确的UTF-8多字节字符中的所有字节都以1xxx xxxx开头。

这意味着在正确的UTF-8序列中,字节0xxx xxxx只能引用单字节字符。因此,如果您有一个正确的UTF-8序列,trim函数将永远不会删除"半个字符"。(非常非常careful about improper UTF-8 sequences。)


sOn 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆