经过广泛的研究,我仍然对如何从字符串中删除多余的空白感到困惑.我的字符串源是Jquery中的一个可编辑的div.我通过AJAX POST传递给php脚本。我把它通过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个空格。我尝试了许多Regex表达式组合。urldecode(),都没有用。$_POST['字符']有什么问题?
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文本区域。所以,我的字符串中包含了一些以机器语言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的空白。我认为这不是一个bug,而是浏览器OS的行为问题。只要让机器把他们的编码转换为通用的HTML实体,然后用REGEX来匹配这个实体并删除它就可以了,希望我为一些人节省了很多时间。
我在后面又加了一个功能。请看一下。
$string = trim(preg_replace('/( )+|\s\K\s+/','', $_POST['characters']));
$string = str_replace(' ','',$string);