2014-01-09 128 views
1

我在解析一個php文件,我想從中獲取一個特定的變量值。preg_match_all帶引號的正則表達式

say $ str ='$ title =「Hello world」; $ author =「極客蝙蝠俠」';

我想得到「極客蝙蝠俠」給變量說,$作者。但我想動態地做到這一點。

讓我們從一個HTML表單輸入值 這麼說

$myDynamicVar = $_POST['var']; //coming from form in the HTML 
//$myDynamicVar = '$title = '; (the user will provide the dollar sign and the equal sign) 

$pattern = '/\'. $myDynamicVar . '"(.*?)"/s'; 
$result = preg_match_all($pattern, $str, $output, PREG_SET_ORDER); 

結果出來空,雖然我知道的變量存在。 我假設它必須用雙引號做,而且我沒有正確地轉義它們。

任何人都可以幫忙嗎?

+1

此任務的背景是什麼?爲什麼你首先需要這個? – zerkms

+0

@zerkms我想創建一個GUI來修改PHP變量(所以沒有PHP技能的用戶可以更新基於PHP變量生成的網站) –

+0

您可以加載php文件嗎?如果是這樣,你可以得到你的變量的內容爲'echo $$ myDynamicVar'。 –

回答

2

這是一個有點瘋狂解析正則表達式的PHP代碼,當proper tokenizer可用:

$str = '$title = "Hello world" ; $author="Geek Batman"'; 

$tokens = token_get_all('<?php ' . $str); 

$state = 0; 
$result = null; 

foreach ($tokens as $token) { 
    switch ($state) { 
     case 0: 
      if ($token[0] == T_VARIABLE && $token[1] == '$author') { 
       $state = 1; 
      } 
      break; 

     case 1: 
      if ($token[0] == T_CONSTANT_ENCAPSED_STRING) { 
       $result = $token[1]; 
       break 2; 
      } 
      break; 
    } 
} 

var_dump($result); 

演示:http://ideone.com/bcV9ol

+0

非常整潔的使用分詞器:) –

+0

謝謝你的偉大的解決方案。它爲我想要的工作 –

1

這個問題更可能與用戶輸入的在正則表達式中具有一些含義的特殊字符(主要是您的案例中的美元,但也可能是其他字符)有關。所以你需要逃避它們(與preg_quote),所以正則表達式匹配$而不是將其解釋爲end of line

(你正在使用逃生美元沒有工作的方式,這是逃避報價關閉字符串,而不是變量內容逃離美元)

嘗試以下操作:

$myDynamicVar = $_POST['var']; //coming from form in the HTML 
//$myDynamicVar = '$title = '; (the user will provide the dollar sign and the equal sign) 

$pattern = '/'. preg_quote($myDynamicVar) . '"(.*?)"/s'; 
$result = preg_match_all($pattern, $str, $output, PREG_SET_ORDER); 
+0

打我吧。 +率 – tenub