【问题标题】:Matching any Unicode whitespace characters in a string with PHP regex使用 PHP 正则表达式匹配字符串中的任何 Unicode 空白字符
【发布时间】:2018-05-18 01:23:54
【问题描述】:

我想在每个空间将文本消息拆分为数组。在我收到这条短信之前,它一直工作得很好。 以下是处理文本字符串的几行代码:

    $str = 'T bw4  05/09/19 07:51 am BW6N 499.803';
    $cleanStr = iconv("UTF-8", "ISO-8859-1", $str);
    $strArr = preg_split('/[\s\t]/', $cleanStr);
    var_dump($strArr);

Var_dump 产生这个结果:

array:6 [▼
 0 => "T"
 1 => b"bw4  05/09/19"
 2 => "07:51"
 3 => "am"
 4 => "BW6N"
 5 => "499.803"
]

数组 "1 => b"bw4 05/09/19"" 中的#1 项不正确,我无法弄清楚数组值前面的字母“b”是什么。 此外,“bw4”和“05/09/19”之间的空格 非常感谢任何关于如何更好地实现字符串拆分的建议。 这是原始字符串:https://3v4l.org/2L35M,这是来自我的本地主机的结果图像:http://prntscr.com/jjbvny

【问题讨论】:

  • 没看到~3v4l.org/TnmK5。你确定你在这里正确地表示了字符串?
  • 这很棘手!当我发布问题时,一些字符可能被过滤掉了。这是原始字符串:3v4l.org/2L35M,这是来自我的本地主机的结果图像:prntscr.com/jjbvny
  • "array:6 [▼" 不是标准的var_dump!您是否正在使用一些提供一些美化转储的框架或 PHP 扩展?
  • @Daniel 问题是,这应该是与 PHP 6 的前向兼容性注释,但从未发生过。直到今天,二进制字符串和非二进制字符串之间没有区别。目前还不清楚这究竟是什么输出

标签: php regex string split


【解决方案1】:

要匹配您可以使用的任何 1 个或多个 Unicode 空白字符

'~\s+~u'

您的 '/[\s\t]/' 模式仅匹配单个空格字符 (\s) 或制表符 (\t)(这当然是多余的,因为 \s 也已匹配制表符),但由于 u缺少修饰符,\s 无法匹配您在bw4 之后的 \u00A0 字符(硬空格)。

所以,使用

$str = 'T bw4  05/09/19 07:51 am BW6N 499.803';
$strArr = preg_split('/\s+/u', $str);
print_r($strArr);

查看PHP demo 产量

Array
(
    [0] => T
    [1] => bw4
    [2] => 05/09/19
    [3] => 07:51
    [4] => am
    [5] => BW6N
    [6] => 499.803
)

【讨论】:

    【解决方案2】:

    我猜您的输入未正确编码。试试:

    $cleanStr = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', utf8_encode($str));
    

    这将为我清理字符串:https://3v4l.org/d80QS(如果这次显示正确的话)。

    注意:这也可能意味着编码在从您的数据库(是否以 UTF-8 存储文本?)、您的 Web 服务器(在 Apache 的 httpd.conf 文件 AddDefaultCharset UTF-8 设置?) ,或在 PHP 中(您的 PHP.ini 文件中的 default_charset 是什么?="utf-8"?)、网站 (<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />) 或源文件开头的 BOM(字节顺序标记)?

    【讨论】:

      【解决方案3】:

      由于您提到的值没有正确分离 首先,尝试修剪两端的字符串

      接下来,用一个空格替换字符串中的多个空格

      $output = preg_replace('!\s+!', ' ', trim($str," "));
      

      之后你可以根据空间爆炸

      $fout = explode(" ",$output);
      

      然后就可以打印了。

      至于b前缀,@Daniel A. White 发布的链接是相关答案

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-18
        • 2018-05-03
        • 1970-01-01
        • 2021-10-16
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多