PHP 写入文件时产生了奇怪的空白。 (块 CSS)
PHP Strange Whitespace is created while writing files. (blocks CSS)
我正在尝试通过 PHP 在 *.php 文件中将代码保存到稍后在 iframe 中的 运行。
问题:
出于某种原因 CSS 不工作(HTML + JS 正在工作!),经过一些试验我注意到文件中的 spaces 不工作真正消除 CSS 代码(用常规键盘替换它们 spaces 解决了问题),所以我尝试找出差异,但它们的 unicodes 是相同的 (UTF-8: 20)。
即使是严格的 PHP 运算符 (===) 也表示它们是相同的,并且 'ord()' returns 两者都是 32。
据我所知,它是在写入文件时创建的。
示例: >JSFiddle<
HTML:
<!--head--><meta http-equiv="content-type" content="text/html; charset=UTF-8">
<input type="text" name="name" />
<textarea name="HTML" [...] spellcheck="false">[HTML in the JSFiddle]</textarea>
<textarea name="CSS" [...] spellcheck="false">[CSS in the JSFiddle]</textarea>
<textarea name="JS" [...] spellcheck="false">[JS in the JSFiddle]</textarea>
PHP:
//mb_internal_encoding() ---> "UTF-8"
$php = fopen($myPath.'/'.$_POST['name'].'.php', 'w');
fwrite($php, '<html><head><style type="text/css">'.$_POST['CSS'].'</style><script type="text/javascript">'.$_POST['JS'].'</script></head><body style="margin: 0;">'.$_POST['HTML'].'</body></html>');
//adding "\xEF\xBB\xBF" doesn't help (all files are in UTF-8)
fclose($php);
问题:
- 为什么 space 不同?
- 我该如何解决?
- 有人用正则表达式替换 whitespace 为正常 space(/\s+/g 生成大量“”和 spaces)吗?
更新 1:
所有数据均为 UTF-8 格式:
echo mb_detect_encoding($_POST['HTML'], 'UTF-8, ASCII', true); //UTF-8
echo mb_detect_encoding($_POST['CSS'], 'UTF-8, ASCII', true); //UTF-8
echo mb_detect_encoding($_POST['JS'], 'UTF-8, ASCII', true); //UTF-8
谢谢! - Minding
空白部分的正则表达式:$str = preg_replace('/[\s\pZ]+/u', ' ', $str);
- \s 是 Posix 空白,\pZ 是 Unicode 空白,修饰符 /u 是为了让 PCRE 理解 UTF-8。
它起作用的事实意味着实际数据必须包含一些其他空白。也许是臭名昭著的 NBSP(Unicode U+00A0,UTF-8 0xc8a0)。但是需要查看原始数据的十六进制转储 - 而不是 JSFiddle 片段。
我正在尝试通过 PHP 在 *.php 文件中将代码保存到稍后在 iframe 中的 运行。
问题:
出于某种原因 CSS 不工作(HTML + JS 正在工作!),经过一些试验我注意到文件中的 spaces 不工作真正消除 CSS 代码(用常规键盘替换它们 spaces 解决了问题),所以我尝试找出差异,但它们的 unicodes 是相同的 (UTF-8: 20)。 即使是严格的 PHP 运算符 (===) 也表示它们是相同的,并且 'ord()' returns 两者都是 32。 据我所知,它是在写入文件时创建的。
示例: >JSFiddle<
HTML:
<!--head--><meta http-equiv="content-type" content="text/html; charset=UTF-8">
<input type="text" name="name" />
<textarea name="HTML" [...] spellcheck="false">[HTML in the JSFiddle]</textarea>
<textarea name="CSS" [...] spellcheck="false">[CSS in the JSFiddle]</textarea>
<textarea name="JS" [...] spellcheck="false">[JS in the JSFiddle]</textarea>
PHP:
//mb_internal_encoding() ---> "UTF-8"
$php = fopen($myPath.'/'.$_POST['name'].'.php', 'w');
fwrite($php, '<html><head><style type="text/css">'.$_POST['CSS'].'</style><script type="text/javascript">'.$_POST['JS'].'</script></head><body style="margin: 0;">'.$_POST['HTML'].'</body></html>');
//adding "\xEF\xBB\xBF" doesn't help (all files are in UTF-8)
fclose($php);
问题:
- 为什么 space 不同?
- 我该如何解决?
- 有人用正则表达式替换 whitespace 为正常 space(/\s+/g 生成大量“”和 spaces)吗?
更新 1:
所有数据均为 UTF-8 格式:
echo mb_detect_encoding($_POST['HTML'], 'UTF-8, ASCII', true); //UTF-8
echo mb_detect_encoding($_POST['CSS'], 'UTF-8, ASCII', true); //UTF-8
echo mb_detect_encoding($_POST['JS'], 'UTF-8, ASCII', true); //UTF-8
谢谢! - Minding
空白部分的正则表达式:$str = preg_replace('/[\s\pZ]+/u', ' ', $str);
- \s 是 Posix 空白,\pZ 是 Unicode 空白,修饰符 /u 是为了让 PCRE 理解 UTF-8。
它起作用的事实意味着实际数据必须包含一些其他空白。也许是臭名昭著的 NBSP(Unicode U+00A0,UTF-8 0xc8a0)。但是需要查看原始数据的十六进制转储 - 而不是 JSFiddle 片段。