Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从JS函数(字符串)获取函数参数_Javascript_Function_Parsing_Parameters - Fatal编程技术网

Javascript 从JS函数(字符串)获取函数参数

Javascript 从JS函数(字符串)获取函数参数,javascript,function,parsing,parameters,Javascript,Function,Parsing,Parameters,我正在解析一个网页,并获得以下JS函数作为字符串 "translate(737.4170532226562,136.14541625976562)" 我想解析字符串以获得函数的两个参数 我可以将字符串解析到“(”和“,”和“)”以获取参数-我想知道是否有其他方法可以从这个字符串函数获取参数。这可能有些过分。但是我很无聊。这是一个函数名解析器。它获取函数名和参数 var program = "translate(737.4170532226562,136.14541625976562)";

我正在解析一个网页,并获得以下JS函数作为字符串

"translate(737.4170532226562,136.14541625976562)" 
我想解析字符串以获得函数的两个参数


我可以将字符串解析到“(”和“,”和“)”以获取参数-我想知道是否有其他方法可以从这个字符串函数获取参数。

这可能有些过分。但是我很无聊。这是一个函数名解析器。它获取函数名和参数

var program = "translate(737.4170532226562,136.14541625976562)";

function Parser(s)
{
  this.text = s;
  this.length = s.length;
  this.position = 0;
  this.look = '0'
  this.next();
}
Parser.prototype.isName = function() {
    return this.look <= 'z' && this.look >= 'a' || this.look <= '9' && this.look >= '0' || this.look == '.'    
}
Parser.prototype.next = function() {
    this.look = this.text[this.position++];
}
Parser.prototype.getName = function() {
  var name = "";
  while(parser.isName()) {
    name += parser.look;
    parser.next();
  }
  return name;
}

var parser = new Parser(program);
var fname = parser.getName();
var args = [];

if(parser.look == '(') {
  parser.next();
    args.push(parser.getName());
    while(parser.look == ',') {
        parser.next();
        args.push(parser.getName());
    }
} else {
    throw new Error("name must be followed by ()")
}

console.log(fname, args);
var program=“translate(737.4170532226562136.1454162597662)”;
函数分析器
{
this.text=s;
此长度=s长度;
这个位置=0;
this.look='0'
这个。下一个();
}
Parser.prototype.isName=函数(){
返回this.look='a'| | this.look='0'| | this.look='
}
Parser.prototype.next=函数(){
this.look=this.text[this.position++];
}
Parser.prototype.getName=函数(){
var name=“”;
while(parser.isName()){
name+=parser.look;
parser.next();
}
返回名称;
}
var parser=新的解析器(程序);
var fname=parser.getName();
var args=[];
if(parser.look=='('){
parser.next();
push(parser.getName());
而(parser.look==','){
parser.next();
push(parser.getName());
}
}否则{
抛出新错误(“名称后面必须跟()”)
}
console.log(fname,args);

您可以使用正则表达式来实现此目的。例如,这个:
/([\d\.]+),([\d\.]+)/

var str=“translate(737.4170532226562136.14541625976562)”;
变量args=/([\d\.]+),([\d\.]+)/.exec(str)
变量a1=args[1],a2=args[2];

document.write(['First argument:',a1',
Second argument:',a2.).join('')
这在语法中称为产生式,所以希望每次解析时都是这样。使用类似于
/translate\([0-9\.]+),([0-9\.]\)/
的正则表达式。或者您可以进行
翻译(a,b)
函数和
eval
字符串,当然,如果你相信源代码的话。嘿@Dinesh看看我的答案,让我知道你的想法。谢谢你的快速回答。我想知道我们是否可以有一个更小更紧凑的解决方案。看看angular源代码,看看他们提取变量名的正则表达式,但是乞丐不应该是挑肥拣瘦的:)