2015-03-31 51 views
3

我已经grepped了一个PHP文件,这是传递给函数的参数的字符串,字符串的的var_dump看起来像这样传递一个字符串作为参数

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

什么,我会喜欢做的事就是把它作为两个参数传递给一个函数。如果在数组中不存在a的机会,那么我可以分解字符串并将两个参数传递给该函数。但我不能也不需要正确解析字符串。

我可以通过调用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:

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

a.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]); 
    } 
+0

所以你的字符串不会总是有','? – Darren 2015-04-01 00:01:51

+0

我们需要更多关于您已经从文件中删除的字符串格式的信息。每次grep时它会保持这种格式,还是可能是其他格式?但要回答你的问题:“是否有一个本地方法传递一个字符串,将其分成一个参数数组”答案是否定的,没有单一的函数可以调用来执行你所要求的。 – 2015-04-01 00:08:40

+0

否,需要一个不必要的复杂正则表达式,此时您正在解析php语法。如果infile是其他东西的转储,那么''是否与其他空白不同? – chiliNUT 2015-04-01 00:40:57

回答

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)

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

措施编号:get_string_between()采取了here

+0

如果字符串包含一个'''或数组包含另一个数组会怎么样? – Gumbo 2015-04-01 07:45:01

相关问题