正则表达式从SQL语句中删除注释
发布时间:2020-12-14 06:32:24 所属栏目:百科 来源:网络整理
导读:我正在尝试使用正则表达式从SQL语句中删除注释. 这个正则表达式几乎有效: (/*([^*]|[rn]|(*+([^*/]|[rn])))**+/)|'(?:[^']|'')*'|(--.*) 除了最后一部分不能很好地处理“ – ”评论.问题是处理SQL字符串,用”分隔. 例如,如果我有 SELECT ' -- Hello
|
我正在尝试使用正则表达式从SQL语句中删除注释.
这个正则表达式几乎有效: (/*([^*]|[rn]|(*+([^*/]|[rn])))**+/)|'(?:[^']|'')*'|(--.*) 除了最后一部分不能很好地处理“ – ”评论.问题是处理SQL字符串,用”分隔. 例如,如果我有 SELECT ' -- Hello -- ' FROM DUAL 它不应该匹配,但它匹配. 这是在ASP / VBscript中. 我想过从右到左匹配,但我不认为VBScript的正则表达式引擎支持它.也试图摆弄负面的背后,但结果并不好.
在PHP中,我使用此代码取消注释SQL:
$sqlComments = '@((['"]).*?[^]2)|((?:#|--).*?$|/*(?:[^/*]|/(?!*)|*(?!/)|(?R))**/)s*|(?<=;)s+@ms';
/* Commented version
$sqlComments = '@
((['"]).*?[^]2) # $1 : Skip single & double quoted expressions
|( # $3 : Match comments
(?:#|--).*?$ # - Single line comments
| # - Multi line (nested) comments
/* # . comment open marker
(?: [^/*] # . non comment-marker characters
|/(?!*) # . ! not a comment open
|*(?!/) # . ! not a comment close
|(?R) # . recursive case
)* # . repeat eventually
*/ # . comment close marker
)s* # Trim after comments
|(?<=;)s+ # Trim after semi-colon
@msx';
*/
$uncommentedSQL = trim( preg_replace( $sqlComments,'$1',$sql ) );
preg_match_all( $sqlComments,$sql,$comments );
$extractedComments = array_filter( $comments[ 3 ] );
var_dump( $uncommentedSQL,$extractedComments );
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
