2015-03-31 91 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

相關問題