6

我正在尝试在引号之外查找参数(单或双)

$sql = "
INSERT INTO Notifify (to_email, msg, date_log, from_email, ip_from)
VALUES
    (
        :to_email,
        'test teste nonono',
        '2013-02-01 10:48:27',
        'bar@foo',
        :ip_from
    )
 ";

  $matches = array();
  preg_match_all('/:[A-Za-z0-9_]*/', $sql, $matches);

上面的代码将产生以下结果,

print_r($matches); // array(:to_email, :48, :27, :ip_from)

我只想:

:to_email
:ip_from
4

3 回答 3

3
'/^\\s*:[A-Za-z0-9_]*/m'

应该做的伎俩,检查行首和空白,并确保 RegEx 查询设置为多行。

编辑

preg_match_all('/(?:^\\s*)(:[A-Za-z0-9_]+)/m', $sql, $matches);
print_r($matches[1]);

这使用了被动非捕获组(?

于 2013-02-01T13:44:35.267 回答
2

您可以使用负面的后视。这样,您将完全匹配所需的内容。

preg_match_all('/(?<!\w):[a-z0-9_]+/', $sql, $matches);

演示

于 2013-02-01T13:54:50.350 回答
1

那这个呢:

/\s+:[A-Za-z0-9_]*/

它不是很严格,对于网球分数 ( 15 : 30) 等更复杂的示例可能会失败,但可能足以满足您的需求。

于 2013-02-01T13:55:18.910 回答