如何去除PHP变量中的空格?


78

我知道这个评论PHP.net。我希望有一个类似trPHP的工具,这样我可以简单地运行

tr -d " " ""

我运行不成功的功能php_strip_whitespace通过

$tags_trimmed = php_strip_whitespace($tags);

我也未成功运行regex函数

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


1
@taztodgmail查看日期。这是2009年,另一个是2013年。2013年是重复的。
莱奥波德·赫兹(LéoLéopoldHertz)2014年

1
供参考:该\ S标志不包括UTF-8字符如UTF-8编码的NBSP ;, PS,四边形和FS stackoverflow.com/questions/2227921/...
ppostma1

1
当然!我有一组代码可以解决该问题
ppostma1 2016年

为什么在首页上弹出?
乔纳森·多斯·桑托斯

Answers:


47

默认情况下,正则表达式不解释UTF-8字符。该\s元字符只占原来的拉丁语集。因此,以下命令仅删除制表符,空格,回车符和换行符

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

随着UTF-8成为主流,当该表达式到达新的utf-8字符时,它会更频繁地失败/停止,从而在空格后面留下了\s无法解释的内容。

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

由于默认情况下,正则表达式无法识别多字节字符,因此只能使用带分隔符的元字符串来标识它们,以防止字节段被其他utf-8字符更改(\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
);

这说明并删除了制表符,换行符,垂直制表符,换页,回车,空格以及其他从此处

nextline,不间断空格,蒙古语元音分隔符,[en quad,em quad,en space,em space,3个em空间,4个em空间,6个em空间,图形空间,标点空间,稀疏空间,头发空间,零宽度空间,零宽度非连接符,零宽度连接符],行分隔符,段落分隔符,狭窄的不间断空间,中等数学空间,单词连接符,表意空格和零宽度非打破空间。

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

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


1
像那样?我试图向您解释旧版本无法正常运行的原因
ppostma1

优秀!能否请您把您的字符集包括在内?--这将帮助我们确定您确实拥有这些字符的完整集合。--我接受了您的答案,因为它比以前接受的答案更完整。
莱奥波德·赫兹(LéoLéopoldHertz)2016年

感谢@Masi的帮助!
ppostma1

1
谢谢,但使用trim()应该是正确的答案
Husam

1
u正则表达式中不应该有标志吗?

133

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

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

另请参阅此答案以获取可以处理UTF-8字符串中的空格的内容。


任何其他解决方案。这个(preg_replace)对我来说失败了。
Kathir

Kathir,用什么输入会失败?
亚历克斯

为什么人们一直把+s?您不需要它。
Buttle Butkus

2
这比逐一替换它们快一个数量级,这就是为什么:)
Paul Dixon 2013年

1
听起来您正在尝试解决与OP不同的问题。这是从字符串中删除所有空格的解决方案。
保罗·迪克森

26

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

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

输出:

My name is

谢谢。正是我想要的
lomse

15
$string = str_replace(" ", "", $string);

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


8

您可以使用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/zh/function.trim.php


1
这应该是正确的答案,就像它在本地所做的一样,这正是OP的要求。通过添加要修剪的额外字符,它体积小,干净且“可扩展”。
Louis Loudog Trottier

修剪不会删除字符串内的空格,只能在左边和右边。顺便说一句,修剪时默认是空格,您不必给出第二个参数

6

如果要从$ tags删除所有地方的空白,为什么不只是:

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

如果您要删除新行,这将需要更多...


2
如果不将结果分配给变量,则实际上不会做任何有用的事情。
Paul Dixon

保罗·迪克森(Paul Dixon)有什么变量?我正在编程,但不知道什么是变量...它有什么用?我可以在网上找到这个吗?重要的是要知道这意味着什么?他们为什么在名称前加上$?
我想知道

2

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

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
Ironwind

是的,我知道它非常复杂,但是它可以工作,并且在某些情况下确实非常强大。不幸的是,这是唯一的方法(而不是创建临时文件,这很丑陋)如何将变量发送到仅适用于文件的函数(而php_strip_whitespace不是唯一的方法)。例如,您可以在需要之前替换代码-您可以为PHP创建自己的“预编译器”,您可以在其中进行任何所需的操作。我使用它,并且在多年的编程过程中它变得非常强大和有用。
micropro.cz

global $$varname;2013
B001ᛦ


1

您还可以使用preg_replace_callbackfunction。该函数与其兄弟姐妹相同,不同之处在于preg_replace它可以使用回调函数,该函数可让您更好地控制输出的方式。

$str = "this is a   string";

echo preg_replace_callback(
        '/\s+/',
        function ($matches) {
            return "";
        },
        $str
      );

1
在Stack Overflow上添加一个说明,说明解决方案为何有效的优良做法。有关更多信息,请阅读“如何回答”
塞缪尔·刘

在这种情况下,回调函数对您有用preg_replace吗?
莱奥波德·赫兹(LéoLéopoldHertz),2017年

1
$string = trim(preg_replace('/\s+/','',$string));

0

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

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;

当HTML实体出现时,标准trim()函数可能会出现问题。这就是为什么我编写了“ Super Trim”功能来处理此问题的原因,并且您还可以选择从字符串的开头,结尾或展位边进行修剪。


0

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

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

                echo $a[$i];
            }

0

\ s regex参数与UTF-8 multybyte字符串不兼容。

我写了这个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)      

0

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

$str=strip_tags($str);

删除冗余标签,错误标签,然后首先获取正常字符串。

并使用

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

对我来说有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.