由于这个问题可能看起来与编码有关,所有内容的编码 - 文本文件,bash脚本文件,终端,提供PHP脚本的网页,PHP脚本本身 - 都是UTF-8.
我确实有很长的bash脚本,它对文本文件执行一系列操作.出于此问题的目的,只有一个sed命令很重要:
#!/bin/bash
sed -r 's: ([”]):\1:g' -i $1
Run Code Online (Sandbox Code Playgroud)
它应该做的是在关闭智能报价之前删除空间.因为我使用更长的正则表达式和更多的字符并希望捕获它以进行替换,因此使用了括号和括号.
Lorem ipsum “dolor sit amet,” consectetur adipisicing elit. Numquam eos quos veniam iste.
Run Code Online (Sandbox Code Playgroud)
我以两种方式使用这个bash脚本:
1)我正在通过键入在Ubuntu 13.10上的命令行执行它 ./script.sh text-file
2)我通过使用以下代码处理Web表单并执行脚本,通过Web浏览器(Apache + PHP)执行它:
<?php
$file = "text-file";
move_uploaded_file($_FILES["file"]["tmp_name"], $file);
shell_exec("./script.sh $file > /dev/null");
rename("$file", "output.html");
header('Content-Disposition: attachment; filename=output.html');
readfile('output.html');
Run Code Online (Sandbox Code Playgroud)
问题是这样 - 当从命令行(1)执行时,脚本给出另一个结果,当通过Web浏览器(2)执行时,其他结果.
当从命令行(1)执行时,它什么都不改变(因为在这种情况下没有任何改变),所以结果与输入相同(在这种情况下我想要实现的输出):
Lorem ipsum “dolor sit amet,” consectetur adipisicing elit. Numquam eos quos veniam iste.
Run Code Online (Sandbox Code Playgroud)
但是当它由PHP(2)执行时,它会在打开智能引号之前删除空格(根据使用的正则表达式,不应该发生):
Lorem ipsum“dolor sit …
Run Code Online (Sandbox Code Playgroud)