使用PHP从字符串中删除字符之间的额外空格
经过广泛的研究,我仍然对从字符串中删除额外的空格感到困惑。 我的字符串源是Jquery中的一个可编辑div。我通过AJAX POST将其传递到php脚本使用PHP从字符串中删除字符之间的额外空格,php,jquery,regex,removing-whitespace,Php,Jquery,Regex,Removing Whitespace,经过广泛的研究,我仍然对从字符串中删除额外的空格感到困惑。 我的字符串源是Jquery中的一个可编辑div。我通过AJAX POST将其传递到php脚本 $('#button').on('click', function () { var text = $('#Editable_DIV').text(); $.ajax({ url: 'foo.php', method: 'POST', dataType: 'text', data:
$('#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_转储$_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.找到解决方案。 正如前面提到的,我的字符串的源代码是一个可编辑的html DIV,我使用它来代替普通的html文本区域。这使得我的字符串与硬编码或PHP maden字符串非常不同。 因此,我的字符串包含一些以机器语言/ASCII代码形式编写的空格,我仍然无法理解。你不可能看到这个编码的空格 这就是为什么正则表达式与'\t nbsp;“”、%C2%A0%等。 Urldecode函数也不起作用,因为它不是URL编码的东西。我没有猜测这些空白中的内容,而是使用以下代码将它们编码为html:
$data = htmlentities($_POST['characters']);
现在我的字符串输出如下:
12345 6
我仍然不明白为什么我的前4个空格被转换为nbsp,但第5个空格显示为正常的“”空格。但至少它解释了为什么正则表达式只删除了1个空格
然后,我可以轻松地删除/stripnbsp和额外的空格
$stripped = trim(preg_replace('/( )+|\s\K\s+/','', $data));
现在,我的输出看起来和预期的一样:
12345 6
让我们将这些html实体(如果字符串中有任何html标记)解码回各自的字符:
$finalString = html_entity_decode($stripped);
现在一切都很完美
总结一下问题:看来不同的浏览器和不同的操作系统可以用不同的东西替换HTML空白。我认为这不是一个bug,而是浏览器/操作系统的行为问题。只需让计算机将其编码转换为通用HTML实体,然后使用正则表达式匹配该实体并将其删除。
我希望我为一些人节省了很多时间。谢谢,但它有同样的效果——它只删除了2个空格,而不是4个空格。看起来有些html代码取代了空格。我不知道该怎么想。硬编码的值是有效的,而通过$\u POST传递的值是无效的。在这种情况下,您得到的输入不是空格。您需要检查一下。在使用preg_replace等处理echo$_post['characters'])之前,是否可以发布echo$_post['characters'])的内容。它可能会提供一些线索。此外,对此也不确定,但可能需要在尝试使用它之前在$_post['characters']上运行urldecode()。在值上使用
urldecode
,然后检查您在相关位置得到的编码百分比值-这将帮助您确定实际处理的字节值。为什么要使用重置运算符\K
?@unbandemanchester检查我更新的问题。urldecode()不会改变任何东西$_处理前的POST['characters']为'12345 6'