从Python脚本中解析PHP文件变量


Parse PHP file variables from Python script

我需要从Python脚本的PHP(Wordpress(配置文件中获取一些数据。如何解析配置数据?例如,如何获取$wp_version值?配置示例:

/**
 * 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';

您知道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. 然后,您可以使用修剪函数来获得单引号和双引号

在线演示

注意1:此正则表达式将在嵌套变量处失败$fail='en_en'$fail2='en_en'
注意2:不要忘记使用i修饰符使其不区分大小写

我写了一个小python脚本,从wordpress的wp-config.php文件中获取pull数据库登录信息,用于进行自动站点备份。

以下是我代码的相关部分(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)