我同意 Dave 的观点,这确实是一个愚蠢的想法,但在您手动进行整个过滤之前,LDAP 过滤器可能是一个解决方案。您必须为可能的组合创建一个巨大的过滤器:
function getCombinations(array $digits = array())
{
$digitToLetters = array(
2 => array('A', 'B', 'C'),
3 => array('D', 'E', 'F'),
4 => array('G', 'H', 'I'),
5 => array('J', 'K', 'L'),
6 => array('M', 'N', 'O'),
7 => array('P', 'Q', 'R', 'S'),
8 => array('T', 'U', 'U'),
9 => array('W', 'B', 'Y', 'Z')
);
$values = array('');
foreach ($digits as $digit) {
$newValues = array();
foreach ($values as $value) {
if (array_key_exists($digits[0], $digitToLetters)) {
foreach ($digitToLetters[$digit] as $letters) {
$newValues[] = $value . $letters;
}
}
}
$values = $newValues;
}
return $values;
}
function getFilterForDigits(array $digits = array()) {
$combinations = getCombinations($digits);
$filter = '(|(sn=' . implode('*)(sn=', $combinations) . '*))';
}
它假设您仅按姓氏 ( sn
) 进行过滤,但您可以轻松更改它,因此它可能更适合givenName
- 请记住,如果您想同时过滤两者,过滤器大小会加倍,这可能会导致 LDAP 请求变慢。
要过滤输入6
,的所有可能结果4
,5
可以调用:
$ds = ldap_connect("...");
$result = ldap_search($ds, "...", getFilterForDigits(array(6, 4, 5)));
我仍然强烈建议不要这样做,但是如果您束手无策,请确保实现某种缓存。:)