请问有没有哪款模板引擎支持中文变量的?

fengyqf 上海北岸信息技术有限公司 2011-03-04 09:52:21
请问有没有哪款模板引擎支持中文变量的?
要做一个简单的项目,但其数据表中字段太多,而且多是专业词汇,看起来太累,所以打算直接使用中文命名,包括设计mysql字段名、php变量名、数组索引等,但遇到一个问题,smarty不支持中文的变量名,gbk与utf8都不行。
所以在此向各们请教:有没有哪款模板引擎支持中文变量的?谢谢
...全文
191 点赞 收藏 17
写回复
17 条回复
ImN1 2011年03月04日
变量名与 PHP 中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。按照正常的正则表达式,它将被表述为:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'。
===========================================================
这个规则让很多汉字被排除在外,GBK/Unicode都是,剩下的想随意用都很困难
除非还要把变量名做一次字符转换,我相信任何模板都难以接受
回复 点赞
fengyqf 2011年03月04日
[Quote=引用 16 楼 maquan 的回复:]

hehe,的确是你说的这样。

我在 IDE 里编辑的时候,编辑器显示有语法错误,我就信以为真了,其实程序本身居然是能执行的。

居然被 IDE 骗了,汗~~~
[/Quote]
呵呵,圣人千虑,必有一失 ^=^
回复 点赞
maquan 2011年03月04日
hehe,的确是你说的这样。

我在 IDE 里编辑的时候,编辑器显示有语法错误,我就信以为真了,其实程序本身居然是能执行的。

居然被 IDE 骗了,汗~~~
回复 点赞
fengyqf 2011年03月04日
[Quote=引用 12 楼 maquan 的回复:]
不过即使是 UTF8 的 PHP 文件,作为变量名的第一个字符,也必须是一个英文字母,这是语法限制,没办法的。
[/Quote]

事实上,我所运行的例子里就是直接写的绝中文名变量,不含英文字母的,正常运行。

http://bbs.phpchina.com/thread-64863-1-1.html
这里说:
...今天翻手册的时候才发现
原来PHP变量名的正则表达式是[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
也就是说支持中文或者其他的非标准ASCII字符作为变量名 不过还没见有人真这么写过...
回复 点赞
maquan 2011年03月04日
刚写了个 GB2312 版的爆破法,试验通过,顺便还发现,居然兼容了 UTF-8 编码,也就是说,GB2312/UTF-8 可以共用这同一个改法了 :D

function yylex2()
{
...
$yy_global_pattern = "...|^(0[xX][0-9a-fA-F]+)|^([0-9]*[a-zA-Z_\\x80-\\xff][\\w\\x80-\\xff]*)|^(\\d+)|^(\\s+)|^(.)/";
...


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
回复 点赞
maquan 2011年03月04日
[Quote=引用 11 楼 fengyqf 的回复:]
maquan能不能再写一个可以在gbk/gb2123编码下使用的“爆破补丁”,肯定还会有人用得着的
[/Quote]
我前面的改法,是利用了 PHP 里正则引擎对 UTF8 的支持,把所有的“Unicode Letter”都纳入变量名的匹配中。

如果要做 GB 版的话,GBK 由于字符集中存在二义性字节,无法准确匹配。GB2312 应该可以,参照原来的改法,只要改成把所有“0x80-0xff“都纳入到变量名的匹配中应该就可以了。
回复 点赞
maquan 2011年03月04日
刚试了一下 6 楼的例子,GBK 编码方式下,$榎梶 作为变量名的确是不行的,似乎可以肯定 PHP 引擎就是以 latin1 的方式来解析 PHP 源程序文件的。

不过如果用 UTF8 的编码方式书写 PHP 源程序文件的话,就不会有问题了,因为 UTF8 编码下,每个中文字符是 3 个字节,且不会出现小于 0x80 的字节。

我前面给出的爆破法,也是针对 UTF8 编码方式的 PHP 源程序文件和模板文件的。

不过即使是 UTF8 的 PHP 文件,作为变量名的第一个字符,也必须是一个英文字母,这是语法限制,没办法的。

而在 Smarty 的模板里却没有这个限制,虽然写成 <!--{$榎梶}--> 的形式,但实际上它并不是一个真正的 PHP 变量,最终它会被翻译成 <?php echo $_smarty_tpl->getVariable('榎梶')->value;?> ,所以 8 楼的结果是符合预期的 :)


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
回复 点赞
fengyqf 2011年03月04日
ansi编码确实不行的,不管使用任何中文字符,大概都不行。
gb下一个中文字符中2字节,而utf8下,一般是3个字节。这样来看,要实现对中文变量的支持,需要分别对gb与utf8要写不同的代码才行。

我对字符编码理解还不够,这个补丁着实不怎么懂。
maquan能不能再写一个可以在gbk/gb2123编码下使用的“爆破补丁”,肯定还会有人用得着的
回复 点赞
ImN1 2011年03月04日
php的编码是?我是ansi不行,无bom unicode可以
回复 点赞
fengyqf 2011年03月04日
[Quote=引用 6 楼 snmr_com 的回复:]

$榎梶

你测试一下,我这边不行
[/Quote]
是这样吗?

...
$榎梶='变量变态的';
$smarty->assign("榎梶", $榎梶);
...



...
<p>{$榎梶}<p>
...


我这里使用smarty3.0.6运行正常,运行可以的
回复 点赞
fengyqf 2011年03月04日
maquan 的爆破很强大,测试了一下:
模板文件与程序文件全部使用utf8编码保存,没有发现错误,运行行正常。在模板里加入一些特殊符号也没有发现错误。
高,实在是高!

snmr_com 所讲的:“GBK中文有些含有7d或者5d分别是\和/,会引起php在解析时的歧义”,能不能举个例子,在什么情况下会出现?
谢谢!
回复 点赞
ImN1 2011年03月04日
$榎梶

你测试一下,我这边不行
回复 点赞
maquan 2011年03月04日
如果 PHP 引擎是按照 GBK/UTF8 字符集来解析 PHP 源文件(而不是按 latin1),那就应该不会把 GBK 字符中所包含的小于 0x80 的字节误判为单独的 ASCII 字符。
回复 点赞
ImN1 2011年03月04日
这样会有麻烦的,GBK中文有些含有7d或者5d分别是\和/,会引起php在解析时的歧义其他一些ASCII符也有这个可能,unicode就更不用说了
回复 点赞
maquan 2011年03月04日
试了一下,Smarty 还真是不支持中文变量名。费了九牛二虎之力,终于找到一个爆破点,改过之后,貌似可以支持中文变量名了。以下仅供参考,不一定管用,也不知道有啥副作用 :)

我用的是 3.0.6,在 Smarty/sysplugins/smarty_internal_templatelexer.php:455 附近有如下的内容:
function yylex2()
{
...
$yy_global_pattern = "...|^(0[xX][0-9a-fA-F]+)|^([0-9]*[a-zA-Z_]\\w*)|^(\\d+)|^(\\s+)|^(.)/u";
...

改成下面的样子即可:

function yylex2()
{
...
$yy_global_pattern = "...|^(0[xX][0-9a-fA-F]+)|^([0-9]*[a-zA-Z_\\pL][\\w\\pL]*)|^(\\d+)|^(\\s+)|^(.)/u";
...


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
回复 点赞
发动态
发帖子
基础编程
创建于2007-09-28

9734

社区成员

14.0w+

社区内容

从PHP安装配置,PHP入门,PHP基础到PHP应用
社区公告
暂无公告