正则表达式从 wp-config 文件中提取信息

Regex to extract information from wp-config file

我想创建一个脚本来备份我所有的 Wordpress 安装,而不必标记所有目录。

我想测试文件 wp-config.php 是否存在,并使用此文件中的信息创建数据库备份。

这是我的脚本,它总是输出 "nothing found":

$content = file_get_contents($sub_dir . '/wp-config.php');
if (preg_match_all("/define\('DB_NAME', '(.*?)'\)/", preg_quote($content, '/'), $result)) {
  print_r($result);
} 
else
  print "nothing found\n";

我想对 DB_USERDB_PASSWORDDB_HOST 进行相同的解析。

这是此配置文件中内容的示例:

../...

// ** Réglages MySQL - Votre hébergeur doit vous fournir ces informations. ** //
/** Nom de la base de données de WordPress. */
define('DB_NAME', 'thedbname');

/** Utilisateur de la base de données MySQL. */
define('DB_USER', 'thedbuser');

/** Mot de passe de la base de données MySQL. */
define('DB_PASSWORD', 'thedbpassword');

/** Adresse de l'hébergement MySQL. */
define('DB_HOST', 'thedbhost');

../...

问题

函数 preg_quote() 转义正则表达式特殊字符,包括 (),因此您的主题字符串不包含

define('DB_NAME', 'thedbname');

相反,它包含

define\('DB_NAME', 'thedbname'\);

你的正则表达式失败了。

解决方案

只需从您的代码中删除 preg_quote(),如下所示:

if (preg_match_all("/define\('DB_NAME', '(.*?)'\)/", $content, $result)) {
  print_r($result);
} else { // note: I added braces; it's better to use them always.
  print "nothing found\n";
}

这可以正常工作并输出:

Array
(
    [0] => Array
        (
            [0] => define('DB_NAME', 'thedbname')
        )

    [1] => Array
        (
            [0] => thedbname
        )

)

Demo.

Here 是读取所有 WP DB 定义的函数:

function get_wordpress_data() {
    $content = @file_get_contents( '../wp-config.php' );

    if( ! $content ) {
        return false;
    }

    $params = [
        'db_name' => "/define.+?'DB_NAME'.+?'(.*?)'.+/",
        'db_user' => "/define.+?'DB_USER'.+?'(.*?)'.+/",
        'db_password' => "/define.+?'DB_PASSWORD'.+?'(.*?)'.+/",
        'db_host' => "/define.+?'DB_HOST'.+?'(.*?)'.+/",
    ];

    $return = [];

    foreach( $params as $key => $value ) {

        $found = preg_match_all( $value, $content, $result );

        if( $found ) {
            $return[ $key ] = $result[ 1 ][ 0 ];
        } else {
            $return[ $key ] = false;
        }

    }

    return $return;
}

这个 returns 这样的数组:

array (size=4)
  'db_name' => string '.........'
  'db_user' => string '.........'
  'db_password' => string '.........'
  'db_host' => string 'localhost'