简短版本:
如何计算字符串中@
的数量,同时排除@
内的[ ]
版本更长:
我正在写一个简单的php类,允许@NamedSqlParameters
与sqlsrv_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}}
我怀疑这里需要@
吗?
答案 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
}