我有这样一句话。
1 2 3 4
如您所见,在 1、2 和 3 个文本之间有多余的空格。我希望输出之间只有一个空格。所以我的输出将是
1 2 3 4
。
如果我使用trim,它只能删除空格,但不能删除空格
如何使用PHP的trim函数来获得这样的输出?
在 php.net 找到这个,效果很好:
$myHTML = " abc";
$converted = strtr($myHTML, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
trim($converted, chr(0xC2).chr(0xA0));
对于那些只想进行修剪的人来说,更具包容性的答案:
$str = trim($str, " \t\n\r\0\x0B\xC2\xA0");
相同的修剪处理 html 实体:
$str = trim(html_entity_decode($str), " \t\n\r\0\x0B\xC2\xA0");
这里的 PHP 文档概述了 html_entity_decode 和修剪交互: http://php.net/manual/en/function.html-entity-decode.php#refsect1-function.html-entity-decode-notes
$str = "1 $nbsp; 2 3 4";
$new_str = str_replace(" ", '', $str);
$str = " abc ";
echo trim($str, "\xC2\xA0"); //abc
回答有点晚了,但希望对其他人有帮助。从html中提取内容时最重要的是在php中使用utf8_decode()。然后所有其他字符串操作都变得轻而易举。即使是外来字符也可以通过直接从浏览器复制粘贴字符到 php 代码中来替换。以下函数将
替换为空格。然后使用 preg_replace()
将所有多余的空格替换为单个空格。最后删除前导和尾随空格。
function clean($str)
{
$str = utf8_decode($str);
$str = str_replace(" ", " ", $str);
$str = preg_replace('/\s+/', ' ',$str);
$str = trim($str);
return $str;
}
$html = "1 $nbsp; 2 3 4";
$output = clean($html);
echo $output;
1 2 3 4
如果你的字符串实际上有“ ”,
$str="1 2 3 4";
$s = str_replace(" ","",$str);
print $s;
echo str_replace ( " ", "", "1 2 3 4" );
只需记住您需要回显 str_replace 的结果,并且您也无需担心空格,因为浏览器只会显示一个空格。
这对我来说很有效:
preg_replace('~\x{00a0}~siu',' ',$content);
上面@Chaoix的答案会破坏你的字符串,如果它以字符开头:
·
(https://www.fileformat.info/info/unicode/char/b7/index.htm)。如果您的文档包含项目符号列表并且您按行或每组行进行修剪,则通常会发生这种情况。
这是因为一些 UTF8 字符是使用 0xC2 和另一个块组成的。对于中间的点,它是 0xC2 0xB7。
我猜 Chaoix 想要精确地修剪“\xC2\xA0”,但是 PHP 修剪函数对每个字符应用一个字符,因此它会修剪 \xC2 和 \xA0 (因此它会破坏由 \xC2 生成的所有 UTF 字符)。
因此,更稳健的方法是:
trim(preg_replace('/^\xc2\xa0|\xc2\xa0$/', '', $str), " \t\n\r\0\x0b")