php - 使用 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)
解决方案
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 匹配该实体并将其删除。我希望我为某些人节省了很多时间。
推荐阅读
- reactjs - 为材质 ui 中的对话框提供最小尺寸
- html - 从背景图像下方过渡文本
- javascript - 为什么这个函数会影响 JS 范围之外的非全局变量?
- excel - VBA宏:根据条件选择工作表并删除行
- laravel - Laravel 形式在 foreach 循环中被剥离
- javascript - Jquery 日期选择器动态 minDate -issue
- php - 如何从输入框中获取存储过程的参数
- c# - 删除单元格边框后不可读的 Word 文档 (OpenXml.Wordprocessing)
- javascript - 单击图像后尝试使自动播放工作
- nattable - CustomLineBorderDecorator 列之间的连续线