传递一个字符串作为参数

时间:2015-03-31 23:52:13

标签: php arrays file foreach preg-match-all

我有一个字符串,它是从php文件中删除的,这是传递给函数的参数,字符串的var_dump看起来像这样

'foo bar', ['name' => 'John, Smith']

以及我想要做的是将它作为两个参数传递给函数。如果在数组中没有机会,那么我可以爆炸字符串并将两个参数传递给函数。但我不能并且需要正确解析字符串。

我可以通过调用eval来解决这个问题。

eval("myfunction({$string});");

哪个会起作用,但使用eval是“有风险的”。是否有一个本地方法来传递一个字符串,将其分成一个参数数组,然后我可以传递给我的函数?

我无法运行这个其他的php文件,或者更改它的代码,我只是想要查询参数(我已经完成)然后将这些参数传递给我自己的函数。

修改

因此可以更改greped的字符串,我的代码需要处理大多数编写php参数的方法(在','或'或'之后没有空格)。它总是一个字符串和一个数组,这是从文本中提取的。

所以它需要支持像

这样的东西
"foo",['name' => 'John, Smith']
"foo",[]
"foo, bar", [1,2 ,3]

类似于反向var_export ... var_import:)

所以,似乎最好的方法是使用eval ...代码是“可信的”但仍然感觉像是一种肮脏的方式,并且认为会有像parse_str或parse_url这样的方法。

编辑2:

所以基本上,两个。 a.txt打开,正则表达式在函数中抓取参数。文件b.php运行正则表达式,然后需要处理字符串以传递给另一个函数。

a.txt无法更改为php文件。需要运行该代码。 (评估如上所述)。

File a.txt

<?php
   ... something ...
   $result = resetResult('foo bar', ['name' => 'John, Smith']);
   .. something ...
 ?>

 File b.php
 <?php
    $fileContents = file_get_contents('a.txt');
    preg_match_all('/resultResult\((.*?)\)/', $fileContents, $matches);
    foreach($matches[1] as $args) {
      // args = 'foo bar', ['name' => 'John, Smith'] but as a string. 
      // need to split args so 'foo bar' can be passed as first argument, and the array as the second argument..
      someFunction($args[0], $args[1]); 
    }

1 个答案:

答案 0 :(得分:1)

我尽我所能,但我还在开始使用PHP。没有将“数组字符串”转换为数组的官方函数,因此我尝试使用json_decode()进行解决方法。

以下是代码和fiddle

<?
function get_string_between($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);
}

$original = "'foo, bar', ['name' => 'John, Smith' , 'anotherKey' => 'another value']";
$str = get_string_between($original, "'", "'");
$arr = get_string_between($original, "[", "]");
$arr = json_decode(str_replace(' => ',':',str_replace('\'','"','{'.$arr.'}')), true);
var_dump($str);
print_r($arr);
?>

输出

string(8) "foo, bar"
Array
(
    [name] => John, Smith
    [anotherKey] => another value
)

然后拨打yourFunc($str,$arr)

当然我的代码可以改进,这只是一个开始。如果数组值包含=>,则会出现问题,这应该是固定的。

P.S。:get_string_between()被采取here