【问题标题】:Get SQL table names from create table statements using preg_match使用 preg_match 从 create table 语句中获取 SQL 表名
【发布时间】:2017-11-10 18:33:37
【问题描述】:

我对正则表达式真的很不好,但我拼命地试图从 SQL“创建表”语句中提取表名,我有这样的事情:

db.sql:

CREATE TABLE `users` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL
   PRIMARY KEY (`user_id`)
);

可能有多个创建表语句,我想获取每个语句的所有表名,我尝试使用这个正则表达式:

<?php

$sql = file_get_contents('db.sql');
preg_match('/create\s+table\s+\`?\w+`/i', $sql, $tables);
var_dump($tables);

它有点工作:

array:1 [▼
  0 => "CREATE TABLE `ps_advbisn_subscription`"
]

但是我希望返回没有“创建表”部分的匹配项,我阅读了前瞻和后防并尝试了这个:

<?php

$sql = file_get_contents('db.sql');
preg_match('/(?<=create\s+table\s+\`?)(\w+)(?=`?)/i', $sql, $tables);
var_dump($tables);

但我得到的只是null。我在这里错过了什么?

【问题讨论】:

    标签: php sql regex


    【解决方案1】:

    你需要做的就是捕捉一个表名,它是用()完成的:

    preg_match('/create\s+table\s+\`?(\w+)`/i', $sql, $tables);
    var_dump($tables[1])
    

    【讨论】:

    • 但为什么会有 2 个结果?
    • 因为第一项是与正则表达式匹配的 full 字符串,第二项是用() 标记的子字符串以被捕获。如果您在正则表达式中添加更多 () - 您将获得更多结果。
    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多