从 SQL 字符串获取冒号前缀的占位符名称

问题描述 投票:0回答:3

我会让这件事变得又快又简单

我有一个查询,我想将其拆分,以便它返回一个数组,其中 : 符号后包含单词。这是我到目前为止所拥有的,它按预期执行,但返回匹配针之前的整个字符串。我只希望数组包含

:
符号后面的单词。

$query = "SELECT user_name FROM test WHERE user_name = :user_name";
$arr = preg_split('/[:]/', $query, 0); 
print_r($arr);

这回来了

Array
(
    [0] => SELECT user_name FROM test WHERE user_name = 
    [1] => user_name
)
php regex placeholder text-extraction sql-parser
3个回答
4
投票

试试这个:

preg_match_all("/:(\w+)/", $string, $matches);

通过这样做, : 之后的所有元素都将位于 $matches[1] 子数组中。 我假设您想要处理具有多个命名参数的 SQL 语句。 例如:

SELECT user_name FROM test WHERE user_name = :user_name and last_name = :last_name

将导致 $matches 为:

array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(10) ":user_name"
    [1]=>
    string(10) ":last_name"
  }
  [1]=>
  array(2) {
    [0]=>
    string(9) "user_name"
    [1]=>
    string(9) "last_name"
  }
}

0
投票

我编辑了你的问题,以便其他人更好地看到结果。但是回答:

preg_split
返回一个数组,你要寻找的是数组的一个元素:

<?php  $arr = preg_split('/[:]/', $query, 0); 

   print($arr[1]);

 ?>

这将返回

user_name
如您所愿。


0
投票

您可能想使用 preg_match() 为此

$query = "SELECT user_name FROM test WHERE user_name = :user_name";
preg_match('/:(\w+)/', $query, $matches);
echo $matches[1]; //gives your user_name
© www.soinside.com 2019 - 2024. All rights reserved.