PHP中如何将http:/\/\test转为http://test?表单URL存储转义问题求助
问题分析与解决方法
首先,你的问题根源在于json_encode()的默认行为:它会自动对URL中的正斜杠(/)进行转义,所以生成的JSON字符串里http://test会变成http:\/\/test,写入到txt文件后就显示为你看到的转义形式。而var_dump($data)显示正常是因为此时$data还是PHP数组,还没经过JSON编码转义。
解决步骤
修改JSON编码参数
在调用json_encode()时,添加JSON_UNESCAPED_SLASHES参数,这个参数会禁止转义正斜杠,保留URL的原始格式:$data = json_encode($data, JSON_UNESCAPED_SLASHES);移除不必要的
urldecode()调用
你的urldecode()其实是多余的——PHP的$_POST变量已经自动对表单提交的参数进行了解码,直接使用$_POST['nameURL']、$_POST['asyncURL']等即可,不需要额外解码。可以把代码里的urldecode()都去掉,比如:"Callback" => $nameURL, // 代替 urldecode($nameURL)
修改后的完整PHP代码片段
if (isset($_POST['submit'])) { $nameURL = $_POST['nameURL']; $param = $_POST['param']; if($_POST['radiobutton']=='asynchronous'){ $asyncURL = $_POST['asyncURL']; $asyncParam = $_POST['asyncParam']; $data = array( "Callback" => $nameURL, "Param" => $param, "asynchronous" => array( "Callback" => $asyncURL, "Param" => array( $asyncParam ) ) ); }else if($_POST['radiobutton']=='synchronous'){ $syncURL = $_POST['syncURL']; $syncParam = $_POST['syncParam']; $data = array( "Callback" => $nameURL, "Param" => $param, "synchronous" => array( "Callback" => $syncURL, "Param" => array( $syncParam ) ) ); } // 添加JSON_UNESCAPED_SLASHES参数防止斜杠转义 $data = json_encode($data, JSON_UNESCAPED_SLASHES); $filename = date('YmdHis').".txt"; if(!file_exists($filename)){ $fh = fopen($filename, 'w') or die("Can't create file!"); } $ret = file_put_contents($filename, $data, FILE_APPEND | LOCK_EX); if($ret == false){ die('There was an error writing this file'); } }
额外说明
- 当你用
var_dump($data)查看数组时,看到的是PHP原生数据结构,没有经过JSON转义,所以URL显示正常;而写入文件的是JSON格式的字符串,默认转义规则会处理斜杠,添加JSON_UNESCAPED_SLASHES就能避免这个问题。 - 你的HTML表单里,
asyncURL和syncURL用的是type="text",可以改成type="url",这样浏览器会自动验证URL格式,提升用户体验。
内容的提问来源于stack exchange,提问作者jhon
相关产品推荐
相关产品推荐

