繁体   English   中英

PHP Regex:在2个括号之间找到许多单词

[英]PHP Regex: find many words between 2 parentheses

我正在尝试解析一个看起来像这样的“插入” MySQL数据库查询:

insert into tablename (field1,   field2, field3) values ('te\'s ,, t', 3, "OO,\"P")

假设:查询始终是“合法” /没有错误。

规则:

  1. 我想在tablename名之后的第一个括号之间获取所有字段名称

2-字段名称可以包含[a-z0-9_] ,它后面总是空格或逗号[, ] 可能有很多空格,也可能只有一个或零个空格。

由于某些原因,它不起作用:我问“在第一个括号后找到所有1-100个字符的单词,该单词后面可能有也可能没有一个或多个逗号或空格:

preg_match_all( 'tablename \((\w{1,100}(?:[, ])*)+\) values/si', $matches, $allfields );

我尝试在PHP中运行preg_match_all(),它只返回最后一个字段。 我想念什么?

第一:顺便说一句,尝试使用简单/幼稚的文本方法解析像SQL这样复杂的语言是一个坏主意。

关于您的特定问题,您的模式不起作用,因为您正试图从重复的捕获组中提取数据。 当您重复一个捕获组时,上一个捕获总是被下一个捕获所覆盖,依此类推。

这样做的模式更加复杂。 这是一个经典的问题: 如何在两个子字符串之间提取多个事物(重复的事物)?

为此,需要使用\\G锚,该锚与上一个结果结尾处的位置匹配。 (请注意:由于一开始没有任何结果,因此\\G锚点将匹配字符串的开头。为避免这种情况,您必须使用否定的前行(?!\\A)以确保字符串将失败。)

(?:\G(?!\A)\s*,|insert\s+into\s+tablename\s*\()\s*\K\w+

图案细节:

(?:             # non capturing group with the two possible beginings
    \G(?!\A) \s* , # contigous to the previous match, spaces, comma
  |                # OR
    insert\s+into\s+tablename\s*\( # the branch for the first result
)
\s*                        
\K    # discard all characters on the left from whole match result
\w+   # the field name

演示

到达最后一个字段时,由于只有右括号而不是逗号,因此连续性被破坏了。 因此\\G将不再成功。

您需要使用正则表达式吗?

我将为此使用PHP自己的String函数。

找到左括号和右括号的位置:

$start = strpos( $sqlQuery, "(" )
$stop = strpos( $sqlQuery, ")" )

然后使用以下命令提取字段名称部分:

$names = substr($sqlQuery, $start, $stop - $start )

然后,您可以分解结果以获取每个单独的字段名称的数组:

$nameParts = explode($names, ",")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM