81

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

tr -d " " ""

php_strip_whitespace我通过以下方式运行该功能失败

$tags_trimmed = php_strip_whitespace($tags);

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

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

15 回答 15

134

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

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

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

于 2009-08-14T19:40:17.820 回答
52

默认情况下,正则表达式不考虑 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
);

这说明并删除了制表符、换行符、垂直制表符、换页符、回车符、空格,此外还从此处删除:

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

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

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

于 2016-10-14T17:03:30.137 回答
27

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

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

输出:

My name is
于 2013-03-07T05:40:39.953 回答
16
$string = str_replace(" ", "", $string);

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

于 2009-08-14T19:37:51.177 回答
8

您可以使用 php 中的修剪功能修剪两侧(左侧和右侧)

 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

于 2016-06-25T12:30:53.110 回答
6

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

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

如果您想删除新行等,则需要更多...

于 2009-08-14T19:39:35.697 回答
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:// 协议上使用任何带有包装器的文件函数(您也可以将它用于包含、要求等):

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

注意:不要忘记让你的变量在全局范围内(比如 global $__myVar)

于 2013-09-04T23:48:33.070 回答
2

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

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

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

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

于 2020-11-27T19:25:47.403 回答
1

您可以使用ereg_replace

 $str = 'This Is New Method Ever';
 $newstr = ereg_replace([[:space:]])+', '',  trim($str)):
 echo $newstr
 // Result - ThisIsNewMethodEver
于 2015-08-16T07:50:02.987 回答
1

您还使用preg_replace_callback功能。这个函数和它的兄弟函数是一样的,preg_replace除了它可以接受一个回调函数,它可以让你更好地控制你如何操作你的输出。

$str = "this is a   string";

echo preg_replace_callback(
        '/\s+/',
        function ($matches) {
            return "";
        },
        $str
      );
于 2017-12-14T21:37:44.537 回答
1
$string = trim(preg_replace('/\s+/','',$string));
于 2020-01-11T01:22:20.720 回答
0

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

$str=strip_tags($str);

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

并使用

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

这对我有用。

于 2020-04-28T15:59:47.720 回答
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() 函数可能会出现问题。这就是为什么我写了“超级修剪”函数来处理这个问题,你也可以选择从字符串的开头、结尾或展位侧进行修剪。

于 2018-01-01T10:27:46.210 回答
0

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

这个 PHP RegEx 是我为解决这个问题而编写的,它使用基于 PCRE(Perl Compatible Regular Expressions)的参数作为 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)      
于 2019-10-21T17:41:48.550 回答
0

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

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

                echo $a[$i];
            }
于 2019-03-06T14:03:07.330 回答