在方括号外部计算字符串中字符的出现次数

时间:2014-04-07 13:06:19

标签: php sql regex

简短版本:

如何计算字符串中@的数量,同时排除@内的[ ]

版本更长:

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

当用户传入PDO_SQLSRV数组时,我需要检查@NamedParamaters是否包含相同数量的$CommandString,最初我会使用{{1} }计算@NamedParamaters的数量,但显然不会考虑非参数相关的substr_count() - 举个例子@

@

那么,我如何计算字符串中$CommandString的数量,同时排除SELECT * FROM [@foo] WHERE ID = @ID AND BAR = @BAR @的{​​{1}}

我怀疑这里需要@吗?

2 个答案:

答案 0 :(得分:2)

您可以使用技巧(*SKIP)(*FAIL)跳过方括号之间的部分:

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

$result = preg_match_all($pattern, $str, $matches);
如果模式稍后失败,

(*SKIP)禁止重写子字符串 (*FAIL)强制模式失败

答案 1 :(得分: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
}