2013-03-14 10 views

Odpowiedz

13

Jeśli nie chcesz używać wyrażeń regularnych, fnmatch() może Ci dobrze służyć w tym [ograniczonym] celu. Pasuje do ciągów znaków przy użyciu symboli podobnych do powłoki, tak jak się spodziewasz.

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

} 
+1

Dam wam +1 za to, że nigdy nie zauważyłem tej funkcji, zanim będzie bardzo przydatna. – Dave

+0

fnmatch kończy się niepowodzeniem z ostrzeżeniami o nazwach plików dłuższych niż 4096 znaków. Ponieważ dopasowuję zestaw danych, a nie nazwę pliku, nie mogę użyć fnmatch – slebetman

+0

@slebetman Dzięki. Dobrze wiedzieć. – Wiseguy

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

} 

użycie strstr() będzie to robić co chcesz lub jak wskazano stristr()

Albo można użyć strpos coś w tym

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

Albo od końca (Myślę, że tego nie przetestowałem)

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

stristr jest wersją niewrażliwą na wielkość liter tego – Waygood

+0

. Zakłada się, że nie ma znaczenia, czy '@ some.text.here' znajduje się na końcu łańcucha, czy nie. – Emissary

+0

Nie stwierdził w swoim przykładzie, że był konkretny o tym, że znajdował się w określonym miejscu w tekście, tylko że był w tekście. Zawsze możesz użyć strpos z strlen-offset, jeśli chcesz przeszukać od końca ciągu, a nie gdziekolwiek, – Dave

3

Można po prostu sprawdzić, czy ciąg kończy się wartością, którą e spodziewa:

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

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

Najszybszy sposób, aby sprawdzić, czy ciąg znajduje się w innym ciągu będzie strpos():

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

Jeśli chcesz mieć pewność, że występuje @ some.text.here na koniec będziesz chciał użyć metody substr_compare().

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

jeśli zaczyna się od tego, zwróconą pozycją jest 0 = fałsz - zobacz odpowiedź Dave'a – Waygood

+0

Jeśli problem polega na tym, że '0' jest niejawnie przekonwertowane na' fałsz', _wyjaśniająco_ konwertuje je do 'fałszu' (z' !! 'lub bezpośrednio casting) tego nie zmieni. – Wiseguy

+0

Oh wow, absolutnie poprawne. Nie wiem, co o tym myślałem. – Sturm

3

Oto dla Ciebie funkcja wieloznaczna.
Gdy szukasz tylko numeru *, skomentowałem . (dopasowanie pojedynczego znaku).

Pozwoli to używać symboli wieloznacznych w ciągu:
*xxx - kończy "XXX"
xxx* - uruchamia "XXX"
xx*zz - zaczyna się od "xx", a kończy "ZZ"
*xx* - ma " xx”w środku

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)) { 

} 

ale sugeruję nauki korzystania regular expressions z preg_match() siebie.

+2

Spójrz na ['fnmatch()'] (http://php.net/fnmatch). – Wiseguy

+0

ooooh! nigdy wcześniej tego nie widziałem! Miły! – Waygood