用于将PHP转换为JS的PHP代码

时间:2010-07-13 09:50:30

标签: php javascript parsing syntax

我需要一些PHP代码将一些PHP转换为JS。

  • 功能 - 我正在使用php.js
  • 中的常用PHP函数
  • 语法 - ???

问题在于转换语法。我不需要完整的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标记,回声,骰子,列表等...故意遗漏)

5 个答案:

答案 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不支持的功能),并拒绝翻译和/或解决问题。


另外,仍然没有告诉我们你正在做什么你为什么要这样做。仍然可能有更准确,有用的答案。帮助我们为您提供更多信息。

  • 您认为由于每秒预计的请求数量非常愚蠢而导致轮询不切实际。你为什么期待这个数字?你的应用程序做了什么会导致这样的情况?
  • 为什么要翻译PHP代码而不是编写特定的Javascript?您只是稍微操纵页面内容,为什么需要PHP代码来做出决定?
  • 语言翻译可能是解决此问题的最简单的解决方案,因此是一个非常糟糕的想法。它不可能作为第一种选择。你有什么其他选择,为什么排除它们?

答案 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。它的支持:

  • 命名空间,使用
  • 类,抽象类扩展和接口
  • 常量和定义
  • 例外和捕获
  • list()
  • 魔术方法__get __set和__call
  • 以及其他