将PHP转换为JS的PHP代码

3

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

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

问题在于转换语法。请注意,我不需要完整的PHP语法;不需要支持类定义/声明。以下是需要转换的内容的简要检查清单:

  • "." 应该是 "+"(字符串连接)
  • "->" 应该是 "."(对象运算符)
  • "::" 应该是 "."(类运算符-不是必需的)

请注意,生成的代码与PHP环境几乎无关,因此不需要考虑“如果它使用PHP类会怎样?”。

我不是要求完整的代码,只是提示正确的方向进行这种转换;我想过使用状态机/引擎。

如果您想知道为什么我要将代码推送到用户端:我需要一种动态方式根据某些条件更改某些元素的可见性。我的计划是这样做,而不必执行此代码服务器端并进行不必要的ajax调用。

编辑:看吧,我知道不使用AJAX听起来对你们来说很荒谬,但世界不是建立在炒作和听起来好的设计条件(=ajax)上的。我简单地无法承受每个用户每秒轮询我的服务器5到10次,只是为了让我的服务器返回“是”或“否”的答案。请记住,切换是异步的,我不能缓冲AJAX调用。

编辑2:我确定在我这种情况下所做的是最好的方式。没有“可能更好”的方法,因此停止发布非建设性的评论。我已经不能再详细地介绍了。将PHP代码转换为JS只是缩短用户输入的问题;我们只需要一个表达式,然后将其转换为必要的语言(在这种特定情况下,从PHP转换为JS)。无论我是否将系统描述到API规范,这些工作条件都不会改变,淹没主题与无用的(对您而言)原型文档毫无帮助。

此外,对于那些认为这个想法是从某个梦中醒来的人,请注意,这已经在技术开发和QA之间进行了审查,因此请不要偏离不存在的设计问题。

编辑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标签、echo、die、list等异类东西)

10
也许我在这里太保守了,但这听起来像是一个会耗费更多时间而不是节省时间的想法。 - Pekka
1
也许你应该告诉我们你想做这个疯狂的事情的原因。为什么用户需要每秒发出5-10个请求?你正在建立的应用程序是什么?可能有其他更好的方法来完成这个任务。 - Charles
2
为什么我要进一步详细说明呢?我已经指定了使用条件,再提供更多细节也不会改变这些条件。现在,请你专注于讨论而不是琐碎的“如果”问题。这个决定经过了三个人的审查(其中两个人审查了技术方面),所以请不要指责我不知道自己在做什么。我可能不是一个备受赞誉的stackoverflow用户,但这并不意味着我是一个玩PHP/JS的新手孩子。 - Christian
4
好的,但你需要明白受众并突出重点。当然,你不能指望编译器专家在线24/7等待着你的问题。我相信你不想要别人直接给你一些代码,但你开头的措辞却暗示了这一点:“我需要一些PHP代码来将一些PHP转换为JS。”我并不是说这是你遇到这个问题的原因。然而,所有涉及方之间存在沟通问题。换句话说,你错误地呈现了问题。 - George Marian
1
我编写了一个基于AST的PHP到JS翻译器,它允许使用Babel将PHP代码运行为JavaScript。 - Kornel
显示剩余11条评论
5个回答

7

好的,让我试着解释一下...

忘掉正则表达式吧。虽然我很喜欢它们,但有一个更好的方法,它已经内置了。看看token_get_all()。它将把PHP源代码解析为字符串,并返回一个列表,其中包含PHP本身使用的相同的标记(包括心爱的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代码来做出决策?
  • 语言翻译可能是解决此问题最不简单的方法,因此是一个非常糟糕的想法。它不能作为第一选择。您有哪些其他选项,为什么已经排除了它们?

我无法想象一种情况,即用户与页面交互并且仅基于用户交互就需要向服务器发出如此多的请求来更新自身。这是一个游戏吗?但如果是这样,那么是否已经有处理用户事件的代码存在呢?缺乏信息使问题变得混乱不清。 - Charles
乔治·马里安,非常有趣 ;)查尔斯,让我简要描述一下正在发生的事情;你正确地将其比作了一个游戏(但它不是一个游戏)。服务器正在批量异步请求中进行轮询,以了解字段详细信息的更改(由其他用户)。这反过来又影响了字段表达式的条件,因此必须重新评估,最终根据评估显示/隐藏字段。这个系统是限制ajax请求数量的拼命努力,由于流行的jquery组件,ajax请求已经足够大了。把这看作是一种协作工具。 - Christian
  1. 一次性处理的字段:很难说。这取决于字段数量和条件。 2/3. 并发用户:最多1到100个,目前还无法确定(我们仍在原型阶段)。是的,我正在预转换代码。当用户进入页面时,首先发生的事情(或多或少)是获取完整的字段列表,包括应该使用JS的表达式。
- Christian
这些用户不允许更改表达式(PHP/JS),但客户端(即监管用户)应该能够以友好的(非技术性)方式修改表达式。https://dev59.com/CnA75IYBdhLWcg3wkZ-A - Christian
2
啊,现在我明白了。你让用户输入代码并执行,这基本上解释了一切。 - Charles
显示剩余4条评论

3

不,我甚至从未听说过它。我现在正在查看它。 - Christian
好的,我看了一下。它看起来非常有趣,但是远远超出了我的需求(类和函数支持)。我也看到它使用了php.js。 - Christian

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));

编辑:无法相信这个问题引起的关注度与花费的时间相比。

随意批评。我个人实际上不太喜欢它。


0
我写了一个叫做php2js的工具,可以自动将PHP代码转换为javascript。它不是完美的,但支持最常见的PHP功能,包括类、继承、数组等等。它还包括并知道php.js,因此使用php标准库函数编写的代码可能会“正常工作”。
也许你会发现它很有用。

哦...传播引用? - kleopatra

-1

我创建了一个名为PHP-to-JavaScript的工具,用于将PHP代码转换为JavaScript。它支持以下功能:

  • 命名空间和use
  • 类、抽象类扩展和接口
  • 常量和define
  • 异常和catch
  • list()
  • 魔术方法__get __set和__call
  • 等等

无法转换。会返回错误或根本无法转换,即使是简单的三行代码。 - Green
@Green 我已经修复了。这只是托管的问题。请查看此应用程序 mojazuvacka.sk,它全部都是使用此转换器制作的。如果可以,请修复您的投票 :) - Tito100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接