2013-06-02 2 views
3

Мне нужно получить некоторые данные из файлов конфигурации PHP (Wordpress) из моего сценария Python. Как я могу анализировать данные конфигурации? Например, как я могу получить $ wp_version значение? Config Пример:Проанализировать переменные файла PHP из сценария Python

/** 
* The WordPress version string 
* 
* @global string $wp_version 
*/ 
$wp_version = '3.5.1'; 

/** 
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. 
* 
* @global int $wp_db_version 
*/ 
$wp_db_version = 22441; 

/** 
* Holds the TinyMCE version 
* 
* @global string $tinymce_version 
*/ 
$tinymce_version = '358-23224'; 

/** 
* Holds the required PHP version 
* 
* @global string $required_php_version 
*/ 
$required_php_version = '5.2.4'; 

/** 
* Holds the required MySQL version 
* 
* @global string $required_mysql_version 
*/ 
$required_mysql_version = '5.0'; 

$wp_local_package = 'en_EN'; 
+0

Если у вас есть доступ к PHP, он может быть более надежным, чтобы использовать PHP для tokenise исходного файла и вывести структуру в более удобном для Python формате - например, с помощью [token_get_all] (http://php.net/manual/en/function.token-get-all.php). –

+0

try https://github.com/ramen/phply – georg

ответ

5

Вы знаете, что простая переменная в PHP, как $foo = 'bar';, давайте создадим регулярное выражение, которое не принимает во внимание то, как $_GET или $foo['bar']:

  1. Начните с $, к сведению что нам нужно сбежать от него:
    \$
  2. Первый символ после $ не может быть числом и должен быть буквой или символом подчеркивания:
    \$[a-z]
  3. Тогда может быть буква или цифры или подчеркивания после него:
    \$[a-z]\w*
  4. Поставим скобку:
    \$([a-z]\w*)
  5. Теперь то должно быть «знак равенства», но, чтобы сделать его более совместимым , давайте пространства необязательны
    \$([a-z]\w*)\s*=\s*
  6. После этого должно быть значение и заканчивается с ;:
    \$([a-z]\w*)\s*=\s*(.*?);$
  7. Мы будем использовать m, который производит ^$ начало матча и конец строки соответственно.
  8. Затем вы можете использовать функцию обрезки, чтобы получить одиночную и двойную кавычки.

Online demo

Примечание 1: Это регулярное выражение потерпит неудачу при вложенных переменных $ терпят неудачу = 'en_EN'; $ fail2 = 'en_EN';
Примечание 2: Не забудьте использовать модификатор я сделать это чувствительно к регистру.

+1

Ваше регулярное выражение работает очень хорошо! Но я добавляю кавычки и удаляю новый символ строки из конца: ** \ $ ([a-z] \ w *) \ s * = \ s * \ '(. *?) \'; ** – inlanger

0

Я написал небольшой скрипт, питона, чтобы получить тянуть базы данных регистрационной информации из файла wp-config.php WordPress для ведения автоматического резервного копирования сайта.

Вот соответствующая часть моего кода (подсветка синтаксиса GitHub имеет проблемы с тройными цитируемыми строками в языке Python):

#!/usr/bin/env python3 
import re 

define_pattern = re.compile(r"""\bdefine\(\s*('|")(.*)\1\s*,\s*('|")(.*)\3\)\s*;""") 
assign_pattern = re.compile(r"""(^|;)\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*=\s*('|")(.*)\3\s*;""") 

php_vars = {} 
for line in open("wp-config.php"): 
    for match in define_pattern.finditer(line): 
    php_vars[match.group(2)]=match.group(4) 
    for match in assign_pattern.finditer(line): 
    php_vars[match.group(2)]=match.group(4) 
+0

Это потрясающе !! Спасибо, что поделился.Одна вещь, которую он не анализирует, определяется с помощью логических или значений int, таких как 'define ('MULTISITE', true);'. Я исправил регулярное выражение для этого с помощью '('|"?) ', Но затем ему пришлось отделить дополнительные пробелы от результирующего значения ... например, когда оно вводится как' define (' MULTISITE ', true); – corradomatt

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