PHP.- Funciones para el acceso al contenido de cadenas

Vamos a estudiar una serie de funciones en PHP que se utilizan para acceder al contenido de las cadenas. De esta forma podremos conocer datos como: tamaño de cadena, comapraciones…
Con las funciones que vamos a estudiar podremos acceder al contenido de las cadenas para obtener información de las mismas o para hacer búsquedas dentro de las cadenas de caracteres.

Funciones para acceder cadenas

Veamos una lista de las nuevas funciones

  • int strlen($cadena), nos devuelve la longitud de la cadenas
  • mixed count_chars($cadenas,[0 1 2 3 4]), nos devuelve una matriz con el número ocurrencias de cada carácter de la cadena, el segundo parámetro es opcional, por ejemplo 0 nos devuelve en las ocurrencias en ASCII de todos los caracteres (hasta los que no aparecen), 1 sólo nos devuelve los que aparecen más de una vez, 2 nos devuelve los caracteres que no aparecen, 3 y 4 son como 1 y 3 pero retornan una cadena sin la cuenta de ocurrencias.
  • Acceso a cadenas desde PHP

    Veamos un ejemplo de uso.

    <!DOCTYPE html>
    <?php
    function mostrar($vector)
    	 {
    	 foreach ($vector as $indice=>$elemento)
     		echo "<p>".$indice."=>".chr($indice)."=>".$elemento."</p>";
    	 }
    $a="Hola, estamos probando las funciones de cadena";
    echo "La longitud de la cadena es: ".strlen($a);
    echo "La cuenta de caracteres es: ".mostrar(count_chars($a,0));  //Repetición de todos
    echo "La cuenta de caracteres es: ".mostrar(count_chars($a,1));  //Repeticiones de los que aparcen
    echo "La cuenta de caracteres es: ".mostrar(count_chars($a,2));  //Los que no aparecen
    echo "Los caracteres usados son:".count_chars($a,3);     //Con el tres y cuatro se devuelve una cadena, no un vector
    echo "Los caracteres no usados son: ".count_chars($a,4);
    ?>
    

    PHP Contar la frecuencia de aparición de una subcadena

    Ahora vamos a contar cuantas veces aparece una subcadena dentro de otra cadena, para hacerlo usaremos una cadena de caracteres llamada candidatos, donde figuran los nombres de unos hipotéticos líderes políticos, por cada vez que figuren será un voto. Nosotros haremos una función para contar esos votos.
    La función a usar es : int substr_count($cadena,$subcadena).

    <?php
    $a="candidato0 candidato1 candidato2  candidato0 candidato1 candidato2 candidato0 candidato1 candidato2 candidato0";
    for ($i=0;$i<4;$i++)
    	$v[$i]=substr_count($a,"candidato$i");
    $mayor=0;
    foreach ($v as $candidato=>$votos)
    	{
    		echo "<p>Votos del candidato$candidato=$votos</p>";
    		if ($votos>$mayor)
    			{
    			$mayor=$votos;
    			$ganador=$candidato;
    			}
    	}
    
    echo "El ganador es: <b>Candidato".$ganador."</b> Con: ".$mayor." votos";
    ?>
    

    PHP.- Otras funciones para el acceso al contenido

    Veamos otras funciones relacionadas:

    • strstr ó strchr, ambas reciben una cadena y una carácter, y nos dicen en que línea es su primera aparición
    • Las dos funciones anteriores son sensibles de mayúsculas y minúsculas, si no queremos que lo sean usaremos stristr, de la misma forma que la anterior
    • En lugar de la primera aparición, puede que nos interese averiguar la última aparición en este caso usaremos strrchr
    • Sin en lugar de buscar un sólo carácter, quiero encontrar una subcadena usaremos strpos para la primera aparición ó strrpos() para la última aparición
    • Veamos algunos ejemplos:

      <?php
      $a="Esta es una frase para un ejemplo";
      //Retornan la subcadena donde comienza
      echo "<p>".strstr($a,"e")."</p>";
      echo "<p>".strchr($a,"E")."</p>";
      echo "<p>".stristr($a,"e")."</p>";   //Esta no distingue mayúsculas
      echo "<p>".strrchr($a,"e")."</p>";   //Aquí vemos la última
      //Retornan la posición de la subcadena
      echo "<p>".strpos($a,"un")."</p>";
      echo "<p>".strrpos($a,"un")."</p>";
      ?>
      

      Obtención de subcadenas con substr

      Vamos a ver una nueva función, muy útil para obtener subcadenas de un string. La función se llama substr($cadena,$comienzo,[$longitud]), esta función retorna la subcadena formada de $cadena, partiendo de la posición $comienzo y con una longitud $longitud. En caso de no indicarse la longitud llegará hasta el final. Si $comienzo es negativo empezará desde el final y longitud se contará hacía delante.
      Lo veremos con un ejemplo.

      <?php
      $cadena="Frase de ejemplo para substr()";
      echo "<p>".substr($cadena,2)."</p>";
      echo "<p>".substr($cadena,2,5)."</p>";
      echo "<p>".substr($cadena,-10)."</p>";
      echo "<p>".substr($cadena,-10,5)."</p>";
      ?>
      

      Comprobar una dirección de correo

      Recopilando distintas funciones que hemos visto en el tema, podemos averiguar si una cadena de texto corresponde a una dirección de correo.

      <?php
      function comprobar_email($email)
      	{ 
         	$mail_correcto = 0; 
         	//Debe tener mas de seis caracteres, debe tener una sóla @, no tiene que empezar ni terminar por @
         	if ((strlen($email) >= 6) && (substr_count($email,"@") == 1) && (substr($email,0,1) != "@") && (substr($email,strlen($email)-1,1) != "@"))
         		{
         		//No debe contener ciertos caracteres ' " \ $ niespacios en blanco 
            	 	if ((!strstr($email,"'")) && (!strstr($email,"\"")) && (!strstr($email,"\\")) && (!strstr($email,"\$")) && (!strstr($email," "))) 
            	 		{ 
               	 	//miro si tiene caracter . una o más veces
               	 	if (substr_count($email,".")>= 1)
               	 		{ 
                  	 		//obtengo la terminacion del dominio desde el último punto!!!
                  	 		$term_dom = substr(strrchr ($email, '.'),1); 
                  	 		//compruebo que la terminación del dominio sea correcta mayor de uno y menor de 5 y sin @
                  	 		if (strlen($term_dom)>1 && strlen($term_dom)<5 && (!strstr($term_dom,"@")) )
                  	 			{ 
                     	 			//compruebo que lo de antes del dominio sea correcto 
                     	 			$antes_dom = substr($email,0,strlen($email) - strlen($term_dom) - 1); 
                     	 			$caracter_ult = substr($antes_dom,strlen($antes_dom)-1,1); 
                     	 			//Antes del . no podemos tener la @ ni otro punto
                     	 			if ($caracter_ult != "@" && $caracter_ult != ".")
                     	 				{ 
                        	 			$mail_correcto = 1; 
                     	 				} 
                  	 			} 
               	 		} 
            	 		} 
         		} 
         	if ($mail_correcto) 
            		return 1; 
         	else 
            		return 0; 
      	} 
      $mail1="micorreo@correo.es";
      $mail2="micorreo@.es";
      echo comprobar_email($mail1);
      echo comprobar_email($mail2);
      ?>
      
      1. En el primer if compruebo que el email tiene por lo menos 6 caracteres (el mínimo), que tiene una arroba y sólo una y que no está colocada ni al principio ni al final.
      2. En el segundo if comprueba que no tiene algunos caracteres no permitidos. Y los restantes hacen comprobaciones de las distintas partes de la dirección de correo, a saber: Que hay un punto en algún lado y que la terminación del dominio es correcta y que el principio de la dirección también es correcto.
      3. Finalmente, se devuelve la variable local utilizada para guardar la validez o incorrección del correo.

      Originally posted 2011-03-01 19:48:43.

6 Responses to “ PHP.- Funciones para el acceso al contenido de cadenas ”

  1. feliciana martínez dice:

    jl,esto no va con este tema pero te envío el trabajo de esta mañana poruqe no me sale lo de buscar persona¿en qué fallo?
    array(924849423,
    “pepito@hotmail.com”),//ES UNA MATRIZ ASOCIATIVA//
    “pedro”=>array (111111111,
    “ere@hotmail.com”),
    “ana”=>array (
    222222222,
    “tre@hotmail.com”),

    “lola”=>array(924849433,
    “pep@hotmail.com”),//ES UNA MATRIZ ASOCIATIVA//
    “alberto”=>array (111111112,
    “Pere@hotmail.com”),
    “diana”=>array (
    222222221,
    “itre@hotmail.com”));
    function pintar_cabecera()
    {
    ?>

    nombre
    telefono
    email

    <?php
    }
    function pintar_fin_tabla()
    {
    echo "”;
    }

    function mostrardatos($agenda)
    {
    foreach ($agenda as $indice =>$contenido)
    echo “”.$indice.””.$contenido[0].””.$contenido[1].””;
    }

    function buscar_persona($agenda,$nombre)
    {
    foreach($agenda as $indice)
    if ($indice==$nombre)
    echo mostrar_persona($nombre);
    }
    pintar_cabecera();
    mostrardatos($agenda);
    $agenda=buscar_persona ($agenda,”juan”);
    pintar_fin_tabla();
    ?>

    nome localiza una persona determinada.

  2. jlmora dice:

    Es por la forma de recorrer la agenda. Si al foreach sólo le pones una variabla tras el as recoge el contenido. Para coger el índice tienes que hacer esto:

    foreach ($agenda as $indice=>$contenido)

    Ahora en índice esta el nombre y en contenido el vector con los demás datos

  3. feliciana martínez dice:

    ¿me puedes explicar más claramente count_chars? los numeros que me indican?no se ponen siempre ¿verdad?,gracias

  4. jlmora dice:

    count_chars($cadenas,[0 1 2 3 4])
    nos devuelve una matriz con el número ocurrencias de cada carácter de la cadena.

    Si lo llamamos con 0 de segundo argumento nos devuelve una matriz con todos los números ASCII y pone para cada uno las veces que no aparece.
    Con 1 nos muestra sólo los que aparecen. Devuelve el ASCII y no el caracter por eso en el ejemplo:
    http://hacerpaginaswebconphp.com/funciones-para-el-acceso-al-contenido-de-cadenas/

    uso la función chr en el mostrar

  5. feliciana martínez dice:

    entendido,gracias

  6. TonchitoZ dice:

    Para Comprobar una dirección de correo desde PHP 5 en adenlante podemos utilizar la función filter_var() con el parametro FILTER_VALIDATE_EMAIL .

    Por lo tanto la función quedaría solamente así:

    function validar_email($correo){
    //COMPRUEBA QUE LA CASILLA DE CORREO ELECTRONICO INGRESADA SEA VALIDA.
    return filter_var($correo, FILTER_VALIDATE_EMAIL) ? true : false;
    }

Deja un comentario