【问题标题】:How can strip whitespaces in PHP's variable?如何去除 PHP 变量中的空格?
【发布时间】:2010-11-19 18:27:35
【问题描述】:

我知道comment PHP.net。 我想有一个类似的工具,比如用于 PHP 的tr,这样我就可以简单地运行

tr -d " " ""

我运行 php_strip_whitespace 的函数失败了

$tags_trimmed = php_strip_whitespace($tags);

我也没有成功运行正则表达式函数

$tags_trimmed = preg_replace(" ", "", $tags);

【问题讨论】:

标签: php string whitespace


【解决方案1】:

要去除任何空格,您可以使用正则表达式

$str=preg_replace('/\s+/', '', $str);

另请参阅 this answer 了解可以处理 UTF-8 字符串中的空格的内容。

【讨论】:

  • 任何其他解决方案。这(preg_replace)对我来说失败了。
  • Kathir,什么输入失败了?
  • 为什么人们总是把+放在s之后?你不需要它。
  • 这比一个一个地替换要快一个数量级,这就是为什么:)
  • 听起来您正在尝试解决与 OP 不同的问题。这是从字符串中删除所有空格的解决方案。
【解决方案2】:

默认情况下,正则表达式不考虑 UTF-8 字符。 \s 元字符仅用于原始拉丁语集。因此,以下命令仅删除制表符、空格、回车和换行符

// http://stackoverflow.com/a/1279798/54964
$str=preg_replace('/\s+/', '', $str);

随着 UTF-8 成为主流,这个表达式在到达新的 utf-8 字符时会更频繁地失败/停止,留下\s 无法解释的空格。

为了处理 unicode/utf-8 中引入的新类型的空白,需要更广泛的字符串来匹配和删除现代空白。

因为正则表达式默认不识别多字节字符,所以只能使用分隔的元字符串来识别它们,以防止字节段被其他 utf-8 字符改变(quad set 中的\x80可以替换智能引号中的所有\x80 子字节)

$cleanedstr = preg_replace(
    "/(\t|\n|\v|\f|\r| |\xC2\x85|\xc2\xa0|\xe1\xa0\x8e|\xe2\x80[\x80-\x8D]|\xe2\x80\xa8|\xe2\x80\xa9|\xe2\x80\xaF|\xe2\x81\x9f|\xe2\x81\xa0|\xe3\x80\x80|\xef\xbb\xbf)+/",
    "_",
    $str
);

这说明并删除了制表符、换行符、垂直制表符、换页符、回车符、空格,以及来自here

下一行、不间断空格、蒙古元音分隔符、[en quad、em quad、en space、em 空格、每 em 三个空格、每 em 四个空格、每 em 六个空格、数字空格, 标点空间, 细空间, 头发空间, 零宽度空间, 零宽度非连接符, 零宽度连接符], 行分隔符, 段落分隔符, 窄不间断空格, 中等数学空间, 单词连接符, 表意空间, 和零宽度不间断的空间。

当从自动化工具或站点导出时,其中许多会在 xml 文件中造成严重破坏,这些文件会破坏文本搜索、识别,并且可以不可见地粘贴到 PHP 源代码中,从而导致解析器跳转到下一个命令(段落和行分隔符)导致代码行被跳过,从而导致间歇性的、无法解释的错误,我们开始将其称为“文本传播疾病”

[从网络复制和粘贴不再安全。使用字符扫描仪来保护您的代码。哈哈]

【讨论】:

  • 喜欢吗?我试图解释旧的不再像以前那样工作了
  • 太棒了!你能包括你在你的集合中拥有的字符数吗? - - 这将帮助我们确定您确实拥有一整套这些角色。 - - 我接受了你的答案,因为它现在比旧接受的答案更完整。
  • 感谢@Masi 的帮助!
  • 谢谢,但是使用trim() 应该是正确的答案
  • 正则表达式中不应该有u 标志吗?
【解决方案3】:

有时您需要删除连续的空格。你可以这样做:

$str = "My   name    is";
$str = preg_replace('/\s\s+/', ' ', $str);

输出:

My name is

【讨论】:

  • 谢谢。正是我想要的
【解决方案4】:
$string = str_replace(" ", "", $string);

我相信 preg_replace 会寻找类似[:space:]的东西

【讨论】:

    【解决方案5】:

    您可以使用 php 中的 trim 函数来修剪两侧(左右)

     trim($yourinputdata," ");
    

    或者

    trim($yourinputdata);
    

    你也可以使用

    ltrim() - Removes whitespace or other predefined characters from the left side of a string
    rtrim() - Removes whitespace or other predefined characters from the right side of a string
    

    系统:PHP 4,5,7
    文档:http://php.net/manual/en/function.trim.php

    【讨论】:

    • 这应该是正确的答案,就像它本身一样,正是 OP 所要求的。通过添加要修剪的额外字符,它小巧、干净且“可扩展”。
    • Trim 不会删除字符串内部的空格,只会删除左右两边的空格。顺便说一句,空间是默认的修剪,你不必给第二个参数
    【解决方案6】:

    如果你想从 $tags 中删除所有空格,为什么不只是:

    str_replace(' ', '', $tags);
    

    如果你想删除新行,这需要更多...

    【讨论】:

    • 如果您不将结果分配给变量,这实际上不会做任何有用的事情。
    【解决方案7】:

    任何可能的选择是使用自定义文件包装器将变量模拟为文件。您可以通过以下方式实现它:

    1) 首先,注册你的包装器(在文件中只注册一次,像 session_start() 一样使用它):

    stream_wrapper_register('var', VarWrapper);
    

    2) 然后定义你的包装类(写得很快,不完全正确,但是可以):

    class VarWrapper {
      protected $pos = 0;
      protected $content;
      public function stream_open($path, $mode, $options, &$opened_path) {
        $varname = substr($path, 6);
        global $$varname;
        $this->content = $$varname;
        return true;
      }
      public function stream_read($count) {
        $s = substr($this->content, $this->pos, $count);
        $this->pos += $count;
        return $s;
      }
      public function stream_stat() {
        $f = fopen(__file__, 'rb');
        $a = fstat($f);
        fclose($f);
        if (isset($a[7])) $a[7] = strlen($this->content);
        return $a;
      }
    }
    

    3) 然后在 var:// 协议上将任何文件函数与您的包装器一起使用(您也可以将其用于 include、require 等):

    global $__myVar;
    $__myVar = 'Enter tags here';
    $data = php_strip_whitespace('var://__myVar');
    

    注意:不要忘记将变量放在全局范围内(如全局 $__myVar)

    【讨论】:

    • 这个很复杂,初学者可能不想看这个。但是为了表现出努力,我会为你投票,以便删除这篇文章中的 -1
    • 是的,我知道它非常复杂,但它确实有效,而且在某些情况下它非常强大。不幸的是,这是唯一的方法(而不是创建很难看的临时文件)如何将变量发送到仅适用于文件的函数(并且 php_strip_whitespace 不是唯一的)。例如,您可以在 require 之前替换代码 - 您可以为 PHP 创建自己的“预编译器”,您可以在其中做任何您想做的事情。我使用它,在多年的编程过程中它变得非常强大和有用。
    • global $$varname; 2013 年有多可怕
    【解决方案8】:

    这是一篇旧帖子,但这里没有列出最短的答案,所以我现在添加它

    strtr($str,[' '=>'']);

    另一种常见的“给这只猫剥皮”的方法是像这样使用爆炸和内爆

    implode('',explode(' ', $str));

    【讨论】:

      【解决方案9】:

      你可以使用ereg_replace来做到这一点

       $str = 'This Is New Method Ever';
       $newstr = ereg_replace([[:space:]])+', '',  trim($str)):
       echo $newstr
       // Result - ThisIsNewMethodEver
      

      【讨论】:

      • ereg 自 PHP 5.3 起已弃用
      【解决方案10】:

      您还使用preg_replace_callback 函数。此函数与其兄弟preg_replace 相同,只是它可以采用回调函数,让您可以更好地控制如何操作输出。

      $str = "this is a   string";
      
      echo preg_replace_callback(
              '/\s+/',
              function ($matches) {
                  return "";
              },
              $str
            );
      

      【讨论】:

      • 在 Stack Overflow 上添加解释为什么您的解决方案应该有效是一种很好的做法。更多信息请阅读How To Answer
      • 您能否添加示例,在哪些情况下回调对preg_replace 有用?
      【解决方案11】:
      $string = trim(preg_replace('/\s+/','',$string));
      

      【讨论】:

        【解决方案12】:

        是旧帖子,但可以这样做:

        if(!function_exists('strim')) :
        function strim($str,$charlist=" ",$option=0){
            $return='';
            if(is_string($str))
            {
                // Translate HTML entities
                $return = str_replace(" "," ",$str);
                $return = strtr($return, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
                // Choose trim option
                switch($option)
                {
                    // Strip whitespace (and other characters) from the begin and end of string
                    default:
                    case 0:
                        $return = trim($return,$charlist);
                    break;
                    // Strip whitespace (and other characters) from the begin of string 
                    case 1:
                        $return = ltrim($return,$charlist);
                    break;
                    // Strip whitespace (and other characters) from the end of string 
                    case 2:
                        $return = rtrim($return,$charlist);
                    break;
        
                }
            }
            return $return;
        }
        endif;
        

        标准的 trim() 函数在出现 HTML 实体时可能会出现问题。这就是为什么我写了“超级修剪”函数来处理这个问题,你也可以选择从字符串的开头、结尾或展位侧进行修剪。

        【讨论】:

          【解决方案13】:

          从整个字符串中删除空格的简单方法是使用explode函数并使用for循环打印整个字符串。

           $text = $_POST['string'];
                      $a=explode(" ", $text);
                      $count=count($a);
                      for($i=0;$i<$count; $i++){
          
                          echo $a[$i];
                      }
          

          【讨论】:

            【解决方案14】:

            \s 正则表达式参数与 UTF-8 多字节字符串不兼容。

            这个 PHP RegEx 是我为解决这个问题而编写的,它使用基于 PCRE(Perl 兼容正则表达式)的参数来替代 UTF-8 字符串:

            function remove_utf8_whitespace($string) { 
               return preg_replace('/\h+/u','',preg_replace('/\R+/u','',$string)); 
            }
            

            - 示例用法-

            之前:

            $string = " this is a test \n and another test\n\r\t ok! \n";
            
            echo $string;
            
             this is a test
             and another test
                     ok!
            
            echo strlen($string); // result: 43
            

            之后:

            $string = remove_utf8_whitespace($string);
            
            echo $string;
            
            thisisatestandanothertestok!
            
            echo strlen($string); // result: 28
            

            PCRE 参数列表

            来源:https://www.rexegg.com/regex-quickstart.html

            Character   Legend  Example Sample Match
            \t  Tab T\t\w{2}    T     ab
            \r  Carriage return character   see below   
            \n  Line feed character see below   
            \r\n    Line separator on Windows   AB\r\nCD    AB
                CD
            \N  Perl, PCRE (C, PHP, R…): one character that is not a line break \N+ ABC
            \h  Perl, PCRE (C, PHP, R…), Java: one horizontal whitespace character: tab or Unicode space separator      
            \H  One character that is not a horizontal whitespace       
            \v  .NET, JavaScript, Python, Ruby: vertical tab        
            \v  Perl, PCRE (C, PHP, R…), Java: one vertical whitespace character: line feed, carriage return, vertical tab, form feed, paragraph or line separator      
            \V  Perl, PCRE (C, PHP, R…), Java: any character that is not a vertical whitespace      
            \R  Perl, PCRE (C, PHP, R…), Java: one line break (carriage return + line feed pair, and all the characters matched by \v)      
            

            【讨论】:

              【解决方案15】:

              有一些特殊类型的标签形式的空白。 你需要使用

              $str=strip_tags($str);

              去除多余的标签,错误标签,先得到一个正常的字符串。

              并使用

              $str=preg_replace('/\s+/', '', $str);

              这对我有用。

              【讨论】:

                猜你喜欢
                • 2017-01-22
                • 2021-10-22
                • 2018-10-25
                • 1970-01-01
                • 2014-05-01
                • 2018-08-20
                • 2020-01-31
                相关资源
                最近更新 更多