首页 > 解决方案 > 使用 PHP 从字符串中删除字符之间的额外空格

问题描述

经过广泛的研究,我仍然对从字符串中删除多余的空格感到困惑。我的字符串源是 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 个空格中的 2 个。

12345   6

但是当我硬编码字符串时

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

它按预期输出

12345 6

'5' 和 '6' 字符之间只有 1 个空格。我尝试了许多正则表达式组合urldecode(),但都没有奏效。$_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)

标签: phpjqueryregexremoving-whitespace

解决方案


1.找到解决方案。

如前所述,我的字符串的来源是一个可编辑的 html DIV,我使用它来代替普通的 HTML 文本区域。这使得我的字符串与硬编码或 PHP 制作的字符串非常不同。因此,我的字符串包含一些以机器语言/ASCII 码形式编写的空格,我仍然无法弄清楚。你不可能看到这个编码的空白。

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

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

现在我的字符串输出这个:

12345     6

我仍然无法弄清楚为什么我的前 4 个空格被转换为nbsp但第 5 个显示为正常的“”空格。但至少它解释了为什么 REGEX 只删除了 1 个空格。

然后我很容易删除/剥离nbsp和额外的空格。

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

现在我的输出看起来像预期的那样:12345 6

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

$finalString = html_entity_decode($stripped);

现在一切都刚刚好。

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


推荐阅读