php - perl 样式正则表达式 mysqldump 列定义

标签 php sql regex parsing mysql

我正在尝试修复 php-mysql-diff 中的错误关于 mysqldump 列定义的解析。

工具会正确解析如下行:

`version_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ucm_item_id` int(10) unsigned NOT NULL,
`ucm_type_id` int(10) unsigned NOT NULL,
`version_note` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'Optional version name',

但是在注释中有 ;(分号)或/(斜杠)的行上失败

`keep_forever` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0=auto delete; 1=keep',

原来的部分正则表达式是

'\((?<tableDefinition>[^;\/]+)\)';

参见 RegExPattern.php :35,我理解为“任何不是 ; 或/的东西”

我想将其扩展为:“任何不是 ; 或/的东西,除非它在一对 ' ”(单勾号)内

我试过这样表达:

([^;\/]+(COMMENT\s\'[^\']+\')?)+[^;\/]*?

可以解释为“重复 |no ; 或/| 后跟可选的 DDL COMMENT 至少一次,后跟一组可选的 |no ; 或/|”

但是,即使我尝试了许多类似的变体,我也无法得到其中任何一个来解析上面的列

除此之外,评论还可以包含单引号“''”(两个单引号)。我以前应用过这个

\'([^\']+|\'\'))\'

(参见 commit) 这也需要以某种方式整合到答案中

引用:匹配表格和列的原始代码:

/**
 * @return string
 */
public static function tables()
{
    $pattern = '/(?<creationScript>CREATE\s+TABLE\s+`(?<tableName>\S+)`\s+';
    $pattern .= '\((?<tableDefinition>[^;\/]+)\)';
    $pattern .= '(?:\s+ENGINE=(?<engine>[^;\s]+))?\s*';
    $pattern .= '(?:AUTO_INCREMENT=(?<autoIncrement>\d+))?\s*';
    $pattern .= '(?:DEFAULT CHARSET=(?<defaultCharset>[^;\s]+))?\s*)';
    $pattern .= '(?:COLLATE=.+?)?\s*';
    $pattern .= '(?:\/\*.+?\*\/)?\s*';
    $pattern .= ';/';
    $pattern .= 's'; // modifier
    return $pattern;
}
/**
 * @return string
 */
public static function column()
{
    $pattern = '/\s*';
    $pattern .= '`(?<columnName>\S+?)`\s+';
    $pattern .= sprintf('(?<columnType>%s)\s*', implode('|', self::$columnTypeRegExps));
    $pattern .= '(?:CHARACTER SET\s+(?<characterSet>\S+))?\s*';
    $pattern .= '(?:COLLATE\s+(?<collate>\S+))?\s*';
    $pattern .= '(?<nullable>NULL|NOT NULL)?\s*';
    $pattern .= '(?<autoIncrement>AUTO_INCREMENT)?\s*';
    $pattern .= '(?:DEFAULT (?<defaultValue>\S+|\'[^\']+\'))?\s*';
    $pattern .= '(?:ON UPDATE (?<onUpdateValue>\S+))?\s*';
    $pattern .= '(?:COMMENT \'(?<comment>[^\']+)\')?\s*';
    $pattern .= '(?:,|$)/';
    return $pattern;
}

最佳答案

您可能需要明确地迎合评论:

修改评论模式:

(COMMENT\s\'[^\']+((\'\')+[^\']*)*\')?

修改tableDefinition模式:

\((?<tableDefinition>([^;\/]+?(.COMMENT.'[^']+(('')[^']*)*'(?!=')))+.*?|[^;\/]+?)\)

关于php - perl 样式正则表达式 mysqldump 列定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36933479/

相关文章:

javascript - AJAX 文件上传中 loaded 和 total 的无意义值

php - 使用 PHP 循环后将数组附加到 JSON 输出

PHP fatal error 未显示在浏览器屏幕上

sql - 性能测试sql查询

regex - 找到 5 个相同的字符后修剪字符串

PHP 和正则表达式只接受形式中的希腊字符

r - 使用 str_replace 有条件替换

php - csrf_token() 在 l5-swagger 中为空,除 GET 请求外无法执行任何请求

mysql - 如何允许用户 sql 访问仅限于某些行的表?

php - MYSQL查询: Sort by input user based on numbers