将字符串作为参数传递


Pass a string as an argument

我有一个从php文件中输出的字符串,它是传递到函数中的参数,字符串的var_dump看起来像这个

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

我想做的是,把它作为两个参数传递给一个函数。如果在数组中不可能出现,那么我可以分解字符串并将两个参数传递给函数。但是我不能并且需要正确地解析字符串。

我可以打电话给eval来解决这个问题。

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

这是可行的,但使用eval是"有风险的"。有没有一个本地方法可以传递一个字符串,将其分隔成一个参数数组,然后我可以将其传递给我的函数?

我不能运行另一个php文件,也不能更改它的代码,我只想grep出参数(我已经做了),然后将这些参数传递给我自己的函数。

编辑:

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

因此,它需要支持以下内容:;

"foo",['name' => 'John, Smith']
"foo",[]
"foo, bar", [1,2 ,3]

有点像反向var_export。。。var_import:)

所以,似乎最好的方法可能是使用eval。。。代码是"可信的",但仍然觉得这是一种肮脏的方法,并认为会有类似parse_str或parse_url的方法。

编辑2:

所以基本上,两个文件。.txt,打开后regex获取函数中的params。文件b.php运行regex,然后需要处理字符串以传递给另一个函数。

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

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

我尽了最大努力,但我还处于PHP的初级阶段。没有将"数组字符串"转换为数组的官方函数,所以我尝试使用json_decode()来解决问题。

这是代码和小提琴

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

则呼叫CCD_ 2。

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

附言:get_string_between()是在这里拍摄的。