使用 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 匹配该实体并将其删除。
我希望我为某些人节省了很多时间。
经过广泛研究后,我仍然对从字符串中删除多余的白色 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 匹配该实体并将其删除。 我希望我为某些人节省了很多时间。