2013-03-14 2 views
5

Можно ли использовать подстановочный знак в выражении if?Соответствующая строка с подстановочными символами оболочки (например, *)

Мой код:

* = подстановочные

if ($admin =='*@some.text.here') { 

} 

$admin будет один из них:

+0

http://php.net/manual/en/function.preg-match.php – Teson

+0

Нет, но вы, вероятно, можете использовать preg_match так, что вы хотите. – j08691

+0

Что это связано с IRC? –

ответ

13

Если вы не хотите использовать регулярные выражения, fnmatch() может послужить вам для этой [ограниченной] цели. Он соответствует строкам с использованием shell-подобных подстановочных знаков, как вы ожидаете.

if (fnmatch('*@some.text.here', $admin)) { 

} 
+1

Я дам вам +1 за то, что я никогда не замечал эту функцию до очень полезной. – Dave

+0

fnmatch не работает с предупреждениями о том, что имена файлов длиннее 4096 символов. Поскольку я сопоставляю набор данных, а не имя файла, я не могу использовать fnmatch – slebetman

+0

@slebetman Спасибо. Хорошо знать. – Wiseguy

1
if (strstr ($admin,"@some.text.here")) { 

} 

использование strstr() это будет делать то, что вы хотите, или, как указывалось stristr()

Или вы можете использовать StrPos что-то вроде этого

$pos = strrpos($mystring, "@some.text.here"); 
if ($pos === false) { // note: three equal signs 
    // not found... 
} else { 
    //found 
} 

Или с конца (Я думаю не протестировано)

$checkstring = "@some.text.here"; 
$pos = strrpos($mystring, $checkstring, -(strlen($checkstring))); 
if ($pos === false) { // note: three equal signs 
    // not found... 
} else { 
    //found 
} 
+0

stristr - это регистр, нечувствительный к регистру этого – Waygood

+0

. Это предполагает, что не имеет значения, находится ли '@ some.text.here' в конце строки или нет. – Emissary

+0

Он не указал в своем примере, если он определенно говорит о том, что он находится в определенном месте в тексте, только что он был в тексте. Вы всегда можете использовать strpos с привязкой strlen, но если вы хотите искать с конца строки, а не где угодно – Dave

3

Вы можете просто проверить, что строка заканчивается значением, е ожидая:

$suffix = '@some.text.here'; 

if (substr($admin, -strlen($suffix)) == $suffix) { 
    // Do something 
} 
0

Самый быстрый способ проверить, если строка найдена в другой строке будет StrPos():

if (strpos($admin, '@some.test.here') !== false) { } 

Если вы должны быть уверены, что @ some.text.here происходит в конце вы захотите использовать substr_compare().

if (substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0) {} 
+0

, если он начинается с этого, возвращаемая позиция равна 0 = false - см. Ответ Dave – Waygood

+0

Если проблема заключается в том, что '0' неявно преобразован в' false', _explicitly_ превращает его в 'false' (с' !! 'или direct кастинг) не изменит этого. – Wiseguy

+0

О, ничего себе, абсолютно правильно. Не знаю, о чем я думал. – Sturm

3

Вот вам подстановочная функция.
Как вы хотите использовать * только я прокомментировал . (односимвольное совпадение).

Это позволит вам использовать групповые символы в течение:
*xxx - заканчивается "ххх"
xxx* - начинается "ххх"
xx*zz - начинается с "хх" и заканчивается "ZZ"
*xx* - имеет " хх»в середине

function wildcard_match($pattern, $subject) 
{ 
    $pattern='/^'.preg_quote($pattern).'$/'; 
    $pattern=str_replace('\*', '.*', $pattern); 
    //$pattern=str_replace('\.', '.', $pattern); 
    if(!preg_match($pattern, $subject, $regs)) return false; 
    return true; 
} 
if (wildcard_match('*@some.text.here', $admin)) { 

} 

, но я предлагаю научиться использовать regular expressions с preg_match() самостоятельно.

+2

Посмотрите на ['fnmatch()'] (http://php.net/fnmatch). – Wiseguy

+0

ooooh! никогда не видел этого раньше! Ницца! – Waygood

Смежные вопросы