使用 PHP 从字符串中删除字符之间的额外空格

Removing extra whitespaces between characters from a string using PHP

经过广泛研究后,我仍然对从字符串中删除多余的白色 space 感到困惑。 我的字符串源是 Jquery 中的可编辑 div。我通过 AJAX POST 将其传递给 php 脚本。

$('#button').on('click', function () {
var text = $('#Editable_DIV').text();
$.ajax({
        url: 'foo.php',
        method: 'POST',
        dataType: 'text',
        data: {characters: text
        },...............

     )}; 
 )};  

我的 foo.php 带有 '12345 6' 字符串内容

$string = trim(preg_replace('/( )+|\s\K\s+/','', $_POST['characters']));

它只删除了 5 个白色 space 中的 2 个。

12345   6

但是当我像这样硬编码字符串时

$string = trim(preg_replace('/( )+|\s\K\s+/','', '12345     6'));

输出如预期

12345 6

“5”和“6”字符之间只有 1 个白色 space。我尝试了许多 Regex 表达式组合,urldecode()、none 有效。 $_POST['characters']有什么问题?

UPD. 我在任何操作之前包括 echo 和 var_dump $_POST['characters'] 的内容,在操作之后包括字符串输出。

**Before:**

12345     6

C:\xampp\htdocs\foo.php:string '12345     6' (length=15)

**After:**

12345    6

C:\xampp\htdocs\foo.php:string '12345    6' (length=14)

我在它后面又加了一个功能。请检查。

$string = trim(preg_replace('/( )+|\s\K\s+/','', $_POST['characters']));
$string = str_replace(' ','',$string);

1.Solution 找到。

如前所述,我的字符串源是一个可编辑的 html DIV,我使用它代替普通的 HTML 文本区域。这使得我的字符串与硬编码或 PHP-maden 字符串非常不同。 因此,我的字符串包含一些以机器 language/ASCII 代码形式编写的白色 space,我仍然无法理解。你不可能看到这种编码的白色 spaces.

这就是为什么 REGEX 不匹配 '\t nbsp; " ", %C2 %A0%' 等 Urldecode 函数也不起作用,因为它不是 URL 编码的东西。我没有猜测那些白色 space 中的内容,而是使用以下代码将它们编码为 html:

$data = htmlentities($_POST['characters']);

现在我的字符串输出如下:

12345     6

我仍然不明白为什么我的前 4 个白色 space 被转换为 nbsp 但第 5 个显示为正常的“”白色 space。但至少它解释了为什么 REGEX 只删除了 1 个白色 space.

然后我很容易 remove/strip nbsp 和额外的 spaces.

$stripped = trim(preg_replace('/( )+|\s\K\s+/','', $data));

现在我的输出看起来符合预期: 12345 6

让我们将那些 html 实体(如果您的字符串中有任何 html 标记)解码回它们各自的字符:

$finalString = html_entity_decode($stripped);

现在一切都很完美。

总结一下问题:看来不同的浏览器,不同的OS可以用不同的东西代替HTML白space。我认为这不是错误,而是 browser/OS 的行为问题。只需让机器将其编码转换为通用 HTML 实体,然后使用 REGEX 匹配该实体并将其删除。 我希望我为某些人节省了很多时间。