[英]PHP Regex: find many words between 2 parentheses
我正在尝试解析一个看起来像这样的“插入” MySQL数据库查询:
insert into tablename (field1, field2, field3) values ('te\'s ,, t', 3, "OO,\"P")
假设:查询始终是“合法” /没有错误。
规则:
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.