我需要一些PHP代码将一些PHP转换为JS。
问题在于转换语法。我不需要完整的PHP语法,请注意;不需要支持类定义/声明。以下是需要转换的小清单:
请注意,生成的代码几乎与PHP环境无关,所以没有“如果它使用PHP类会怎么样?”。
我不是要求完整的代码,只是提示这种转换的正确方向;我正在考虑使用状态机/引擎。
如果您对我为什么要向用户方推送代码感到好奇:我需要一种动态的方法来改变某些条件下某些元素的可见性。我的计划是在不必执行此代码服务器端并进行不必要的ajax调用的情况下执行此操作。
编辑:看看人物。我知道没有使用AJAX听起来很荒谬,但世界并不适用于炒作和听起来不错的设计条件(= ajax)。我根本无法承受每个用户每秒轮询我的服务器5到10次,只是为了让我的服务器返回“是”或“否”的答案。请记住,切换是异步的,我无法缓冲AJAX调用。
编辑2:我确信我所做的是我情况下最好的方式。没有“可能更好”的方式,所以退出发表非建设性的评论。我不能比我已经有更多细节了。从PHP代码到JS的转换只是缩短用户输入的问题;我们只需要一个表达式,然后将其转换为必要的语言(在这种特殊情况下,从PHP到JS)。无论我如何将系统描述为API规范,并且使用无用的(为您)原型文档淹没主题,这将无法改变的条件 。
另外,对于那些认为这个想法来自醒来形成一些梦想的人;知道这已经在技术开发和质量保证之间进行了审核,所以请不要偏离不存在的设计问题。
编辑3:示例(原始PHP代码和预期输出):
5=="test"
- 5=="test"
'$'.(func(12)*10)
- '$'+(func(12)*10)
Fields::count()==5
- Fields.count()==5
$this->id==5
- this.id==5
关于最后一个例子,不要担心上下文/范围,这是正确的。还要注意表达式可能看起来很奇怪;这是因为他们是表达;必须返回值的单行代码,这解释了缺少EOL(;)和多次使用返回布尔值。 (异常的东西,如反引号操作符执行,PHP标记,回声,骰子,列表等...故意遗漏)
答案 0 :(得分:7)
好的,让我来看看这个......
螺旋正则表达式。我爱他们,但有一种更好的方式,而且内置它。查看token_get_all()
。它将PHP源解析为字符串并返回the very same tokens that PHP itself uses列表(包括心爱的T_PAAMAYIM_NEKUDOTAYIM)。然后,您可以完全重建脚本源,一次一个令牌,并在此过程中将其转换为Javascript语法。
[charles@teh ~]$ php --interactive
Interactive shell
php > print_r(token_get_all('<?php class Foo { public function bar() { echo "Yikes!"; } } $f = new Foo(); $f->bar(); ?>'));
Array
(
[0] => Array
(
[0] => 368
[1] => <?php
[2] => 1
)
[1] => Array
(
[0] => 353
[1] => class
[2] => 1
)
[2] => Array
(
[0] => 371
[1] =>
[2] => 1
)
[3] => Array
(
[0] => 307
[1] => Foo
[2] => 1
)
...
虽然这可能有点矫枉过正,但它也使用了PHP使用的相同解析规则,因此应该比正则表达式更少长期痛苦。它还使您可以灵活地检测无法翻译的功能(即php-js不支持的功能),并拒绝翻译和/或解决问题。
另外,仍然没有告诉我们你正在做什么和你为什么要这样做。仍然可能有更准确,有用的答案。帮助我们为您提供更多信息。
答案 1 :(得分:3)
您是否尝试过Harmony Framework?
答案 2 :(得分:2)
这是我提出的快速而肮脏的解决方案,写在20分钟内(可能有很多错误),但它看起来很有效。
function convertPhpToJs($php){
$php=str_split($php,1); $js='';
$str=''; // state; either empty or a quote character
$strs=array('\'','`','"'); // string quotes; single double and backtick
$nums=array('0','1','2','3','4','5','6','7','8','9'); // numerals
$wsps=array(chr(9),chr(10),chr(13),chr(32)); // remove whitespace from code
foreach($php as $n=>$c){
$p=isset($php[$n-1])?$php[$n-1]:'';
$f=isset($php[$n+1])?$php[$n+1]:'';
if($str!='' && $str!=$c){ $js.=$c; continue; } // in a string
if($str=='' && in_array($c,$strs)){ $str=$c; $js.=$c; continue; } // starting a string
if($str!='' && $str==$c){ $str=''; $js.=$c; continue; } // ending a string
// else, it is inside code
if($c=='$')continue; // filter out perl-style variable names
if($c==':' && $f==':'){ $js.='.'; continue; } // replace 1st of :: to .
if($p==':' && $c==':')continue; // filter out 2nd char of ::
if($c=='-' && $f=='>'){ $js.='.'; continue; } // replace 1st of -> to .
if($p=='-' && $c=='>')continue; // filter out 2nd char of ->
if($c=='.' && (!in_array($p,$nums) || !in_array($f,$nums))){ $js.='+'; continue; } // replace string concat op . to +
if(in_array($c,$wsps))continue; // filter out whitespace
$js.=$c;
}
return $js;
}
以下内容:
$window->alert("$".Math::round(450/10));
转换为:
window.alert("$"+Math.round(450/10));
编辑:不能相信这个问题引起的所有麻烦与所花费的时间相比。
随意批评。我个人并不喜欢它。
答案 3 :(得分:0)
我写了一个名为php2js的工具,它可以自动将PHP代码转换为javascript。它并不完美,但支持最常见的PHP功能,包括类,继承,数组等等。它还包括并了解php.js,因此使用php的标准库函数编写的代码可以&#34;只是工作&#34;。
也许你会发现它很有用。
答案 4 :(得分:-1)
我创建了工具PHP-to-JavaScript,用于将PHP代码转换为JavaScript。它的支持: