2014-01-09 8 views
1

Я разбираю php-файл, и я хочу получить от него определенное значение переменной.preg_match_all regex с кавычками

скажите $ str = '$ title = "Hello world"; $ author = "Geek Batman" ';

Я хочу получить «Geek Batman» данной переменной say, $ 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 Я хочу создать графический интерфейс для изменения переменных 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); 

Demo: 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

Побей меня. + rate – tenub

Смежные вопросы