2010-07-20 28 views
5

Básicamente necesito una función para verificar si los caracteres de una cadena (cada carácter) están en una matriz.¿Cómo comprobar si una cadena está en una matriz?

Mi código no está funcionando hasta ahora, pero aquí está de todos modos,

$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...";} 

lo quiero decir 'Sí, encontrado.' si una de las letras en $ input se encuentra en $allowedChars. Lo suficientemente simple, ¿verdad? Bueno, eso no funciona, y no he encontrado una función que busque los caracteres individuales de una cadena por un valor en una matriz.

Por cierto, quiero que sean solo los valores de la matriz, no estoy buscando html_strip_entities o lo que sea, quiero usar esa matriz exacta para los caracteres permitidos.

Respuesta

6

Usted realmente debe mirar en expresiones regulares y la función preg_match: http://php.net/manual/en/function.preg-match.php

Pero, esto debe hacer su trabajo petición específica:

$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

¿Está familiarizado con las expresiones regulares? Es una especie de forma más aceptada de hacer lo que intentas hacer, a menos que me falta algo aquí.

Tome un vistazo a preg_match(): http://php.net/manual/en/function.preg-match.php

Para hacer frente a su ejemplo, he aquí algunos ejemplos de código (actualizado para solucionar problemas en las observaciones):

$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 :("; 

Una pequeña explicación de la expresión regular : el '^' coincide con el comienzo de la cadena, la '[a-zA-Z0-9 @ ._ + -]' significa "cualquier carácter en este conjunto", el '*' después de que significa "cero o más" de lo último ", y finalmente el '$' al final coincide con el final de la cadena.

+0

Ah, gracias, pero cuando corro que se dice que el - antes del guión da un error :(¿Por qué es No No estoy familiarizado con las expresiones regulares: P, así he oído hablar? pero no puedo hacer que valga nada: P – Scott

+0

Esto no es lo que él quiere. Consulte "si una de las letras en $ entrada se encuentra en". Para solucionar eso, elimine '^' y '$'. – NawaMan

+0

Hmm, lo he hecho pero todavía me da este error: Advertencia: preg_match() [function.preg-match]: modificador desconocido '-' en /home/jaxo/web/tests/test.php en línea (línea con instrucción preg_match) – Scott

1

Un enfoque algo diferente:

$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

Debido simplemente está validando una cadena, vea preg_match() y otras funciones PCRE para manejar esto en su lugar.

Como alternativa, puede utilizar strcspn() hacer ...

 

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

1

Validación de los caracteres de una cadena que se hace más adecuadamente con las funciones de cadena.
preg_match() es el método más directo/elegante para esta tarea.

Código: (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 

Patrón Explicación:

/   # 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 

puntos significativos:

  • Los ^ y $ anclas son cruciales para asegurar que toda la cadena se valida versus solo una subcadena de la cadena.
  • El \w (también conocido como "palabra carácter" -> a shorthand character class) es la forma sencilla de escribir: [a-zA-Z0-9_]
  • El .dot character pierde su "nada que coincida con (casi)" significado y se convierte en literal cuando se escribe en el interior de una clase de personaje. No se necesita una barra de escape.
  • El guión en el interior de un character class se puede escribir sin una barra escape (\-), siempre que el que se coloca al comienzo o al final de la clase de caracteres. Si el guión no está en el inicio/final y no se escapa, creará un rango de caracteres entre los caracteres a cada lado.
    Nos guste o no, [.-z] no coincidirá con un símbolo de guión porque no existe "entre" el carácter de punto y la letra minúscula z en el ascii table.
  • El * que sigue a la clase de caracteres es el "quantifier". El asterisco significa "0 o más" de la clase de caracteres anterior. En este caso, esto significa que preg_match() permitirá una cadena vacía. Si desea denegar una cadena vacía, puede usar + que significa "1 o más" de la clase de caracteres anterior. Finalmente, puede ser mucho más específico sobre la longitud de la cadena al usar un número o números en una expresión entre corchetes.
    • {8} significa que la cadena debe tener exactamente 8 caracteres de longitud.
    • {4,} significa que la cadena debe tener al menos 4 caracteres de longitud.
    • {,10} significaría que la longitud de cadena debe estar entre 0 y 10.
    • {5,9} significaría la longitud de la cadena debe estar entre 5 y 9 caracteres.

Todo ese consejo a un lado, si es absolutamente necesario utilizar el conjunto de caracteres y que quería utilizar un bucle para comprobar los caracteres individuales en contra de su gama de validación (y ciertamente no lo recomiendo it), entonces el objetivo debería ser reducir la cantidad de elementos de la matriz involucrados para reducir las iteraciones totales.

  • Su matriz $allowedChars tiene varios elementos que contienen el carácter de espacio, pero solo uno es necesario. Debe preparar la matriz usando array_unique() o una técnica similar.
  • str_split($input) correrá la posibilidad de generar una matriz con elementos duplicados. Por ejemplo, si $input="Test Test Test Test";, la matriz resultante de str_split() tendrá 19 elementos, 14 de los cuales requerirán verificaciones de validación redundantes.
  • Probablemente se podría eliminar las redundancias de str_split() llamando count_chars($input,3) y la alimentación que a str_split() o, alternativamente, se podría llamar str_split() continuación array_unique() antes de realizar el proceso iterativo.
+0

Esta es una gran respuesta, ¡pero hice esta pregunta hace más de 7 años! Espero que ayude a alguien en el futuro, sin embargo. – Scott

+1

Sí, eso es todo lo que estaba buscando. Aclamaciones. – mickmackusa

Cuestiones relacionadas