2013-10-27 19 views
5

Tôi muốn có chức năng kiểm tra xem các mục của một mảng có phải là một chuỗi hay không. Như vậy:Chuỗi mảng có chứa (một phần của) không?

array(1 => 'Super-user', 'Root', 'Admin', 'Administrator', 'System', 'Website', 'Owner', 'Manager', 'Founder'); 

Và sau đó kiểm tra cho admin12 nên trở thành sự thật như một phần của admin12 (admin) cũng là một phần của mảng.

tôi đi này cho đến nay:

$forbiddennames= array(1 => 'Super-user', 'Root', 'Admin', 'Administrator', 'System', 'Website', 'Owner', 'Manager', 'Founder');  

if(in_array(strtolower($stringtocheck), array_map('strtolower', $forbiddennames))){ 
     echo '"This is a forbidden username."'; 
    } else { 
     echo 'true'; 
    } 
} 

Chỉ này chỉ echos "Đây là một tên người dùng bị cấm." khi tôi kiểm tra admin. Tôi cũng muốn nó vang khi kiểm tra admin12.

Điều này có thể (và cách thực hiện) không?

+2

Tôi không nghĩ rằng đây là nhiều của một trùng lặp với http://stackoverflow.com/questions/4366730/how -to-check-if-a-string-chứa-cụ thể-từ - một mảng của chuỗi chắc chắn có phẩm chất khác nhau hơn chỉ là một chuỗi, và tôi đang nhìn vào làm điều này với một regexp. Làm thế nào có thể một đối tượng này "đánh dấu là trùng lặp"? – guaka

Trả lời

5

Vòng qua các mảng $forbiddennames và sử dụng stripos để kiểm tra xem chuỗi đầu vào cho phù hợp bất kỳ của các mục trong mảng:

function is_forbidden($forbiddennames, $stringtocheck) 
{ 
    foreach ($forbiddennames as $name) { 
     if (stripos($stringtocheck, $name) !== FALSE) { 
      return true; 
     } 
    } 
} 

Và sử dụng nó như dưới đây:

if(is_forbidden($forbiddennames, $stringtocheck)) { 
    echo "This is a forbidden username."; 
} else { 
    echo "True"; 
} 

Demo!

+0

Điều này cho phép "admin12" để echo đúng, trong khi tôi muốn nó để echo "đây là một ..." bởi vì "admin12" (đầu vào) chứa "Admin" (từ mảng f.n.). – Isaiah

+0

@Isaiah: Đó là một lỗi nhỏ từ phía tôi. Tôi vô tình chuyển các tham số cho 'stripos()'. Vui lòng xem câu trả lời được cập nhật (và [demo] (https://eval.in/57770)) –

+0

Đúng, bạn nói đúng! – Isaiah

2

Nó không thực sự quan trọng nếu bạn sử dụng array_map, foreach hoặc đôi khi hing khác nhau. Giải pháp có thể có:

$forbiddenNames = array('admin', 'bannedName'); 
$input = 'Admin12'; 
$allowed = true; 
foreach($forbiddenNames as $forbiddenName) { 
    if(stripos($input, $forbiddenName) !== false) { 
     echo $input, ' is invalid'; 
     $allowed = false; 
     break; 
    } 
} 
if($allowed === true) { 
    echo $input, ' is valid'; 
} 
+0

Hoạt động tốt, cảm ơn! – Isaiah

2

bạn muốn chức năng 'strpos' của PHP. lặp qua mỗi phần tử mảng, và sau đó kiểm tra mỗi phần tử chống lại 'strpos' PHP strpos reference

foreach($forbiddennames as $fn){ 
if(strpos($stringtocheck,$fn)){ 
    //found it! 
}else{ 
    //not found! 
} 
} 
+0

Tại sao bạn đi qua toàn bộ mảng, nếu có khả năng phá vỡ sau khi tìm thấy một tên không hợp lệ? – Rangad

+0

'strripos' tốt hơn nếu bạn muốn tìm kiếm phân biệt chữ hoa chữ thường. Tôi sẽ sử dụng nó trên 'strpos', nhưng mẫu mã về cơ bản sẽ giống nhau –

+1

@ChrisWesson: Đó là khác nhau. Tôi nghĩ rằng bạn có nghĩa là 'stripos()' (với một 'R') :) –

3
foreach ($forbiddennames as $forbiddenname) { 
    $nametocheck = strtolower($stringtocheck); 
    if(strpos($stringtocheck, $forbiddenname) !== false) { 
     echo "This is a forbidden username."; 
     break; 
    } 
} 
+0

Bạn nên kiểm tra! ==, vì strpos cũng có thể trả lại 0 nếu kết hợp được tìm thấy – Rangad

+0

Đúng, hoàn toàn đúng – Ash

Các vấn đề liên quan