2014-04-07 22 views
1

短版本:计数出现时,外面的方括号

如何算@数“的字符串s,同时排除@[ ]

在s更长的版本:

我正在写一个简单的php类允许使用@NamedSqlParameterssqlsrv_query()(我意识到这已经可以使用PDO_SQLSRV - 但据我了解,PDO_SQLSRV仅适用于Windows环境 - 此类适用于使用MS SQL Linux驱动程序的Debian环境)。

当用户通过在@NamedParamaters一个数组,我需要检查$CommandString包含@NamedParamaters相等数量的,最初我以为ID逃脱使用substr_count()来算的@的数量,但是这显然不会拿考虑到非参数相关@的 - 举个例子$CommandString

SELECT * FROM [@foo] WHERE ID = @ID AND BAR = @BAR 

所以啊,我怎么算的@数量的一个字符串,而排除小号

[ ]内S”

我怀疑preg_match_all这里需要吗?

回答

2

你可以使用:

$s = 'SELECT * FROM [@foo] WHERE ID = @ID AND BAR = @BAR'; 
if (preg_match_all('/\[[^]]*\]|(@)/', $s, $m)) { 
    $count = count(array_filter($m[1])); 
    echo $count; // 2 
} 
+0

它的切肉刀:-)''''和's'之间有一个额外的空间 –

+0

谢谢,错误修正:) – anubhava

+1

伟大的工程,谢谢:) – HeavenCore

2

可以使用的伎俩(*SKIP)(*FAIL)方括号内跳过部分:

$pattern = '~\[[^]]*](*SKIP)(*FAIL)|@~'; 

$result = preg_match_all($pattern, $str, $matches); 

(*SKIP)禁止一个子被重试,如果方式失败后
(*FAIL)强制模式失败

+0

虽然我不明白,但它的作品! –

+0

林不知道,但我不这是正确处理倍数,例如,它在以下返回1:'SELECT * FROM [@foo] INNER JOIN [@bar] ON什么=什么WHERE ID = @ID和BAR = @BAR和WOOF = @ WOOF' - 无论哪种方式,anubhava的答案都很棒:) – HeavenCore

+2

@SabujHassan:很简单,你首先尝试匹配方括号内的内容(确保第二部分的替换'@'不在括号内)。 '(* SKIP)'是一个回溯控制动词,强制子字符串在右侧子模式失败时不被regex引擎重试。 '(* FAIL)'使其失败。 –