2010-07-20 63 views
5

Tôi về cơ bản cần một chức năng để kiểm tra xem ký tự của một chuỗi (mỗi ký tự) có nằm trong một mảng hay không.Cách kiểm tra xem chuỗi có nằm trong mảng không?

Mã của tôi không hoạt động cho đến nay, nhưng ở đây nó là dù sao,

$allowedChars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","0","1","2","3","4","5","6","7","8","9"," ","@",".","-","_","+"," "); 

$input = "Test"; 
$input = str_split($input); 

if (in_array($input,$allowedChars)) {echo "Yep, found.";}else {echo "Sigh, not found...";} 

Tôi muốn nó nói 'Vâng, được tìm thấy.' nếu một trong các chữ cái trong $ input được tìm thấy trong $allowedChars. Đủ đơn giản, phải không? Vâng, điều đó không làm việc, và tôi đã không tìm thấy một chức năng mà sẽ tìm kiếm một chuỗi ký tự riêng lẻ cho một giá trị trong một mảng.

Nhân tiện, tôi muốn nó chỉ là các giá trị của mảng, tôi không tìm kiếm html_strip_entities ưa thích hoặc bất kể nó là gì, tôi muốn sử dụng mảng chính xác đó cho các ký tự được cho phép.

Trả lời

6

Bạn thực sự nên xem xét regex và chức năng preg_match: http://php.net/manual/en/function.preg-match.php

Nhưng, điều này sẽ làm cho công việc theo yêu cầu cụ thể của bạn:

$allowedChars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","0","1","2","3","4","5","6","7","8","9"," ","@",".","-","_","+"," "); 
$input = "Test"; 
$input = str_split($input); 
$message = "Sigh, not found..."; 
foreach($input as $letter) { 
    if (in_array($letter, $allowedChars)) { 
     $message = "Yep, found."; 
     break; 
    } 
} 
echo $message; 
4

Bạn có quen với cụm từ thông dụng không? Đó là loại cách được chấp nhận nhiều hơn để làm những gì bạn đang cố gắng làm, trừ khi tôi đang thiếu thứ gì đó ở đây.

Hãy xem preg_match(): http://php.net/manual/en/function.preg-match.php

Để giải quyết ví dụ của bạn, sau đây là một số mẫu mã (CẬP NHẬT ĐẾN ĐỊA CHỈ CÁC VẤN ĐỀ TRÊN COMMENTS):

$subject = "Hello, this is a string"; 
$pattern = '/[a-zA-Z0-9 @._+-]*/'; // include all the symbols you want to match here 

if (preg_match($pattern, $subject)) 
    echo "Yep, matches"; 
else 
    echo "Doesn't match :("; 

Một lời giải thích chút của regex : '^' khớp với phần đầu của chuỗi, phần '[a-zA-Z0-9 @ ._ + -]' có nghĩa là "bất kỳ ký tự nào trong tập hợp này", ký tự '*' sau đó có nghĩa là "không hoặc nhiều hơn của điều cuối cùng ", và cuối cùng là '$' ở cuối khớp với phần cuối của chuỗi.

+0

Ah, cảm ơn bạn, nhưng khi tôi chạy mà nó nói rằng - trước khi các dấu gạch dưới cung cấp cho nó một lỗi :(tại sao là Không Tôi không quen thuộc với RegEx: P, tôi cũng đã nghe nói về? nhưng tôi không thể làm điều đó có giá trị gì: P – Scott

+0

Đây không phải là những gì anh ta muốn. Xem "nếu một trong các chữ cái trong $ input được tìm thấy trong". Để khắc phục điều đó, hãy xóa '^' và '$'. – NawaMan

+0

Hmm, tôi đã làm điều đó nhưng nó vẫn cho tôi lỗi này: Cảnh báo: preg_match() [function.preg-match]: Trình sửa đổi không xác định '-' trong /home/jaxo/web/tests/test.php trên line (dòng với câu lệnh preg_match) – Scott

1

Một cách tiếp cận hơi khác:

$allowedChars = array("a","b","c","d","e"); 
$char_buff = explode('', "Test"); 
$foundTheseOnes = array_intersect($char_buff, $allowedChars); 
if(!empty($foundTheseOnes)) { 
    echo 'Yep, something was found. Let\'s find out what: <br />'; 
    print_r($foundTheseOnes); 
} 
0

Vì bạn chỉ cần xác nhận một chuỗi, xem preg_match() và các chức năng PCRE khác để xử lý thay thế này.

Ngoài ra, bạn có thể sử dụng để làm strcspn() ...

 

$check = "abcde.... '; // fill in the rest of the characters 
$test = "Test"; 
echo ((strcspn($test, $check) === strlen($test)) ? "Sigh, not found..." : 'Yep, found.'); 

1

Members các ký tự trong một chuỗi được một cách thích hợp nhất được thực hiện với các chức năng chuỗi.
preg_match() là phương pháp trực tiếp/thanh lịch nhất cho công việc này.

Code: (Demo)

$input="Test Test Test Test"; 
if(preg_match('/^[\w [email protected]_-]*$/',$input)){ 
    echo "Input string does not contain any disallowed characters"; 
}else{ 
    echo "Input contains one or more disallowed characters"; 
} 
// output: Yes, input contains only allowed characters 

Pattern Giải thích:

/   # start pattern 
^   # start matching from start of string 
[\w [email protected]] # match: a-z, A-Z, 0-9, underscore, space, plus, dot, atsign, hyphen 
*   # zero or more occurrences 
$   # match until end of string 
/  # end pattern 

điểm đáng kể:

  • Các ^$ neo là rất quan trọng để đảm bảo rằng toàn bộ chuỗi được xác nhận so với chỉ một chuỗi con của chuỗi.
  • Các \w (aka "bất kỳ ký tự chữ" -> một shorthand character class) là cách dễ dàng để viết: [a-zA-Z0-9_]
  • Các .dot character mất "phù hợp với bất cứ điều gì (hầu như)" của nó ý nghĩa và trở nên đen khi nó được viết bên trong một lớp nhân vật. Không có dấu gạch chéo thoát là cần thiết.
  • Dấu gạch nối bên trong của character class có thể được viết mà không có dấu gạch chéo (\-) miễn là nó được đặt ở đầu hoặc cuối của lớp ký tự. Nếu dấu gạch nối không ở đầu/cuối và dấu gạch ngang không được thoát, nó sẽ tạo ra một dải ký tự giữa các ký tự ở hai bên của nó.
    Thích hay không, [.-z] sẽ không khớp với ký hiệu dấu gạch nối vì nó không tồn tại "giữa" ký tự dấu chấm và chữ thường z trên ascii table.
  • * theo sau lớp ký tự là "quantifier". Dấu hoa thị có nghĩa là "0 hoặc nhiều hơn" của lớp ký tự trước đó. Trong trường hợp này, điều này có nghĩa là preg_match() sẽ cho phép một chuỗi rỗng. Nếu bạn muốn từ chối một chuỗi rỗng, bạn có thể sử dụng + có nghĩa là "1 hoặc nhiều hơn" của lớp ký tự trước đó. Cuối cùng, bạn có thể cụ thể hơn về độ dài chuỗi bằng cách sử dụng một số hoặc số trong một biểu thức có dấu ngoặc nhọn.
    • {8} có nghĩa là chuỗi phải dài 8 ký tự.
    • {4,} có nghĩa là chuỗi phải dài ít nhất 4 ký tự.
    • {,10} có nghĩa là độ dài chuỗi phải nằm trong khoảng từ 0 đến 10.
    • {5,9} có nghĩa là độ dài chuỗi phải từ 5 đến 9 ký tự.

Tất cả các lời khuyên đó sang một bên, nếu bạn hoàn toàn phải sử dụng mảng của bạn của nhân vật và bạn muốn sử dụng một vòng lặp để kiểm tra đặc điểm cá nhân chống lại mảng xác nhận của bạn (và tôi chắc chắn tôi không khuyến khích nó), thì mục tiêu phải là giảm số lượng các phần tử mảng liên quan để giảm tổng số lần lặp lại.

  • Mảng $allowedChars của bạn có nhiều yếu tố chứa ký tự khoảng trắng, nhưng chỉ có một phần tử là cần thiết. Bạn nên chuẩn bị mảng bằng cách sử dụng array_unique() hoặc một kỹ thuật tương tự.
  • str_split($input) sẽ chạy cơ hội tạo một mảng có phần tử trùng lặp. Ví dụ: nếu $input="Test Test Test Test"; thì mảng kết quả từ str_split() sẽ có 19 phần tử, 14 trong số đó sẽ yêu cầu kiểm tra xác thực dư thừa.
  • Bạn có thể loại bỏ dư thừa từ str_split() bằng cách gọi count_chars($input,3) và nạp số đó vào str_split() hoặc cách khác bạn có thể gọi trước khi thực hiện quy trình lặp lại.
+0

Đây là một câu trả lời tuyệt vời, nhưng tôi đã hỏi câu hỏi này cách đây hơn 7 năm! Tôi hy vọng nó sẽ giúp ai đó trong tương lai, mặc dù. – Scott

+1

Vâng, đó là tất cả những gì tôi đã làm. Chúc mừng. – mickmackusa

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