piapia123
zh

HTML 转后端语言输出代码

网络

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把一段 HTML 变成 ASP、VB.NET、JSP、PHP 或 Perl 里的输出语句。手工改的麻烦不在引号,而在几个各自藏得很深的坑:VB 家族把引号写成两个、C 家族写反斜杠,写错就是白屏;PHP 双引号里的美元符会插值,一段含价格的 HTML 放进去会少掉一段内容;JSP 字符串里的 `%>` 与 PHP 里的 `?>` 会提前闭合脚本片段,后面的 HTML 直接变成页面正文 —— 这与 HTML 转 JS 时要处理的 `</script>` 是同一类事故。这些这里都按各语言自己的规则处理掉,处理不了或做了例外的部分会写在生成代码的注释里。

功能

  • 五种目标:ASP(VBScript)、ASP.NET(VB.NET)、JSP、PHP、Perl
  • 引号按各语言自己的写法转义:VB 家族写成两个引号,PHP、Perl、JSP 写成反斜杠
  • PHP 与 Perl 的美元符、Perl 的 @ 会被转义,不会被当成变量插值
  • 字符串里的 %> 会写成 %\>、PHP 里的 ?> 写成 \x3f>,不会提前闭合脚本片段
  • 每行一条输出语句,换行如实保留,不会把整段 HTML 压成一行
  • 换行一律用 \n,不用 println 这类跟着平台走的写法,Windows 与 Linux 上产物一致
  • CRLF 与 LF 都接受,输出统一成 LF
  • 空行与末尾换行如实处理:不多生成一条语句,也不少
  • 生成的注释写英文 —— 它要进 .jsp、.php 这些源文件
  • 输出带语法着色,可整块复制

使用方法

  1. 把要输出的 HTML 片段粘进输入框
  2. 选目标语言
  3. 需要时关掉「断开脚本结束标记」—— 只有你确信内容里没有 %> 或 ?> 时才关
  4. 复制生成的语句,粘进对应的模板文件

常见问题

为什么是一行一条输出语句,不是整段一次输出?
因为这才是能直接粘进模板、并且逐行对照调试的形式。整段一次输出当然更短,但那需要各语言自己的多行字符串机制(PHP 的 heredoc、Perl 的 here-doc、VB 的字符串拼接),五种语言五种写法,而且一旦哪一行的转义出了问题,你要在一整段里找出错在哪一行。一行一条时,出错的那一行自己就是一行。
为什么每行后面跟着 & vbLf 或者 \n?
因为这些输出语句都不会自己补换行:ASP 的 Response.Write、PHP 的 echo、JSP 的 out.print 都是原样写出你给的字符串。不补的话,整段 HTML 会被拼成一行 —— 对多数标签无所谓,但 `<pre>`、`<textarea>` 里的换行是实质内容,压掉就是内容损坏。末尾那一行如果原文里没有换行,这里也不会补。
PHP 和 Perl 里的美元符为什么被转义了?
因为这两个语言的双引号字符串会插值:PHP 里 `"$name"` 取变量,Perl 里 `$name` 与 `@name` 都会。一段含占位符或价格的 HTML(`<b>$99</b>`、`mailto:me@example.com`)原样放进去,轻则输出里少一段内容、重则运行时抛未定义变量的警告 —— 而这两种失败看起来都像「数据本来就是空的」。JSP 那边美元符没有特殊含义,所以不会被转。
那个「断开脚本结束标记」是什么意思?
JSP 与 ASP 的代码写在 `<% ... %>` 里,PHP 写在 `<?php ... ?>` 里,而模板解析器扫的是源码里的那两个字符,不看它们是不是在字符串里。所以一句 `echo "<div>?>";` 会在 `?>` 处直接结束 PHP 模式,后面的内容变成页面正文显示给用户 —— 不报错、不白屏,只是页面上多出一段奇怪的文字。开启这个选项后,`%>` 会写成 `%\>`(模板解析器认这个转义)、PHP 的 `?>` 写成 `\x3f>`(十六进制转义),值不变、源码里也不再出现那个序列。
为什么生成的 PHP 结尾没有 ?>?
PHP 官方手册明确建议纯 PHP 文件省略结尾的 `?>`:它后面如果跟着换行或空格,那些字符会被当成输出发给浏览器,于是页面开头多出空白 —— 而这类空白会导致 header() 报「headers already sent」,一个出了名难查的错误。ASP 与 JSP 的 `%>` 是必需的,保留。
HTML 会被上传吗?
不会。转换全部在浏览器内存里完成,页面不发送任何请求,断网也能用。

相关工具