Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP从字符串中删除字符之间的额外空格_Php_Jquery_Regex_Removing Whitespace - Fatal编程技术网

使用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:

经过广泛的研究,我仍然对从字符串中删除额外的空格感到困惑。 我的字符串源是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_转储$_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'