duduromeroa.com

Programación web

Ejemplos de sintaxis PHP: funciones incorporadas (parte 1)


www.duduromeroa.com, animación, lector, gif

Por Eduardo Romero

Guayaquil, Ecuador

Contacto duduromeroa@gmail.com

#Guayaquil, #PHP, #funcionesIncorporadas, #duduromeroa


ATENCIÓN: Los conceptos a continuación requieren de conocimiento previo en fundamentos de programación. Reseñas de otros lenguajes de programación se hallan en este vínculo.



Funciones incorporadas o predefinidas en PHP

En la sección anterior revisamos la correcta sintaxis para funciones y el uso de argumentos como valores de función. Ahora vamos por las funciones incorporadas desde PHP.

Lo incorporado o predefinido quiere decir que son funciones ya armadas desde PHP, las cuales solo necesitamos invocarlas y agregarles datos en forma de parámetros. Al igual que las funciones creadas por el propio programador, las funciones incorporadas son útiles para ejecutar más acciones como búsquedas, ordenación, conteo o conexión entre datos, entre otros.

A continuación revisaremos la mayoría de ellas y en orden diverso.

Accediendo a caracteres individuales: Función strlen()

La función strlen() retorna la ubicación del índice de caracteres individuales en un string o línea de caracteres. En el ejemplo de abajo se usa la sintaxis $fraseNueva[$i] con corchete cuadradado para adjuntar la iteración de un valor. Antes de la versión PHP 7.4 se usaban (y a esta anulado) los corchetes para esa referencia de valor.

En .PHP

<?php 

// Función strlen()
$frase = 'Guayaquil';
$medirLetras = strlen($frase);  

// Invocando $medirLetras 
echo $medirLetras."<hr>";
// 9

// O directamente
echo strlen($frase)."<hr>"; 
// 9

// O en un bucle, usando una referencia de índice en $i
$fraseNueva = 'GYE';
echo "...Para la palabra GYE " . "<br>";

for ($i=0; $i < strlen($fraseNueva); $i++) {

echo("El índice " . $i . " es para ". $fraseNueva[$i]) . "<br>"; 
}

/*
La ubicación 0 es para G
La ubicación 1 es para Y
La ubicación 2 es para E
*/
?>

Separando espacios en blanco en linea de caracteres: Función ltrim() y rtrim()

Quitan los espacios en blanco, al final y al inicio de una línea de caracteres o string. Eso, porque en ingresos de usuario algunos espacios pueden ser insertados por el usuario, sin intención. Ojo con las referencias LEFT y RIGHT en cada función. Ojo también con la referencia entre las variables $limpiarL y $limpiarR, donde una variable es parte de la función para la limpieza total del string.

En .PHP

<?php  
// String con espacios
$fraseA = "  Guayaquil ";

// Limpiar espacios en blanco desde LEFT - izquierda
$limpiarL = ltrim($fraseA); 

// Limpiar espacios en blanco desde RIGHT - derecha
$limpiarR = rtrim($limpiarL); 

    // Resultados
    // Sin limpieza
    echo "*" . $fraseA . "*" . "<hr>";
    // * Guayaquil *

    // Limpio de espacios desde LEFT
    echo "*" . $limpiarL . "*" . "<hr>";
    // *Guayaquil *

    // Limpio de espacios desde RIGHT
    echo "*" . $limpiarR . "*" . "<hr>";
    // *Guayaquil*
?>

Alterando mayúsculas y minúsculas en caracteres: Funciones strtolower(), strtoupper(), ucfirst(), ucwords()

Alteran todos los caracteres o solo los primeros de cada palabra. Ojo con el último ejemplo en el código de abajo. En PHP las funciones se ejecutan desde la más interna hacia la más externa. En el caso mencionado, primero todos los caracteres en bajas con strtolower() y luego altas de cada primera letra con ucwords()

En .PHP

<?php  
    $string1 = "julio jaramillo"; 
    $string2 = "av. quito"; 

    // Hacer todas minusculas
    echo strtolower($string1) . "<hr>"; 
    // R: julio jaramillo

    // Hacer todas mayusculas
    echo strtoupper($string1) . "<hr>"; 
    // R: JULIO JARAMILLO

    // Hacer solo la primera mayúscula
    echo ucfirst($string2) . "<hr>";
    // R: Av. quito

    // Hacer TODOS los primeros caracteres en mayúsculas
    echo ucwords($string2) . "<hr>";
    // R: Av. Quito

    // Si mezclamos mayusculas y minúsculas, podemos:
    // Primero todas en bajas con strtolower()
    // Luego altas de cada primera letra con ucwords()
    $string2 = "jUliO jARAmIllo"; 
    echo ucwords(strtolower($string2));
    // Julio Jaramillo 
?>

Removiendo tags HTML de una línea de caracteres con strip_tags()

Únicamente elimina tags HTML, pero no filtra ni alerta de atributos peligrosos que podrían contener los tags que no serán omitidos; como en el bloque de código segundo (ejemplo abajo), en donde el segundo argumento indica el tag que NO será removido.

En .PHP

<?php 
    // Aloja frase con tag <p>
    $fraseConTag = '<p>Eres perla que surgiste</p>'; 
    $quitadoTags = strip_tags($fraseConTag);

    echo $quitadoTags;
    // Eres perla que surgiste 

    // --- Con segundo argumento

    $fraseDosTags = '<i>Guayaquil</i> de <b>mis amores</b><p>'; 
    // De forma implicita se elimina <i></i>, pero
    // ...aquí se indica que quedará tag <b>
    $dejaUnTag = strip_tags($fraseDosTags, '<b>');

echo $dejaUnTag;
// Guayaquil de <b>mis amores</b>
?>

Sin embargo, cuando la función strip_tags() omite tags, aquellos tags que quedan podrían contener atributos peligrosos. La función strip_tags() no filtra tags malévolos en aquellos tags que permite que se queden en el string. Por ejemplo, atributos style podrían tener reglas CSS para alterar la página, y el atributo onmouseover podría ejecutar código que ataque la web desde Javascript.

En otras palabras, los tags indicados en el segundo argumento de strip_tags() (es decir, aquellos que NO serán omitidos) podrían tener atributos hostiles. Esos atributos no serán filtrados por strip_tags().

En el ámbito de limpieza de potencial código dañíno (llamado sanitización o saneamiento de código) existen librerías de código que eliminan caracteres con código dañino, como <...>, {...}, [...],"". Y especialmente la función htmlspecialchars() convierte esos caracteres en código alfanumérico, evitando que el navegador interprete sintaxis (como Javascript) con código maligno.

En .PHP

<?php 

/* La función de Javascript onmouseover 
activa un código cuando el cursor pasa 
encima del elemento que activa el código */

$codigoMalo = "onmouseover = 'alert('xxxx DañaLaWeb xxx')' Da click";
echo htmlspecialchars($codigoMalo);

/* Algunos signos de apertura y cierre 
serán convertidos en sintaxis ilegible 
para el navegador  */
// onmouseover='alert('xxxx DañaLaWeb xxx')' Da click 

?>

Agregando representaciones codificadas según correcta convención para URLs con rawurlencode()

El internet usa direcciones que apuntan a recursos digitales. A esas direcciones se las conoce como localizadores de recursos únicos o uniformes (URL, en inglés). Las URL son necesarias para ubicar archivos entre servidores en una red como la Internet.

Cuando hacemos una consulta en Google o desde un formulario, todas esas consultas serán adaptadas a una convención correcta de URL. Por ejemplo, una URL no puede contener espacios ni palabras con signos, como tildes o diéresis. Para que la URL sea correcta, el sistema automatiza los espacios, las tildes y otros signos y los reemplaza con una convención correcta:

  • Cuando son consultas desde formularios o buscadores (especialmente después del signo que representa al parámetro de consulta ?), los espacios se reemplazan con el signo +
  • Cuando son consultas para apuntar a archivos, especialmente después del nombre de un dominio, los espacios en blando se reeemplazan con la entidad %20
  • Nota: El signo de parámetro de consulta ? separa la ruta URL de los valores con los que el usuario está consultando algo. Por ejemplo:
     // URL de consulta desde un buscador
    https://www.ejemplo.com/articulos?categoria=ropa&precio_max=100
    
    /* Esa URL pide:
    - En la web 'ejemplo,' en el archivo 'articulos'...
    - ...En seccion 'categoria' buscar ropa no mayor a 100 */
    

Por lo tanto, una URL correcta reemplazará espacios en blanco y otros signos de una consulta hecha por un usuario común (que posiblemente solo escribirá la consulta con espacios y tildes, ya que desconoce de informática):

En .PHP

// En Google el usuario escribe
quiero encebollado con ají

// Pero el sistema lo cambia a:
https://www.google.com/search?q=quiero+encebollado+con+aj%C3%AD&...
// Donde no existen espacios en blanco ni tildes

Por lo tanto, la función rawurlencode() agrega sintaxis de URL a las entradas de consultas hechas por el usuario, y así convertir esa consulta a una URL que Internet pueda interpretar:

En .PHP

<?php 
$usuarioPide = "encebollado, limón y ají";

// Se arma URL y se añade sintaxis correcta de URL
$urlCorrecta = "www.comida.com/buscar?q=" . rawurlencode($usuarioPide);

// El ingreso del usuario se transformó en
echo $urlCorrecta;
// www.comida.com/buscar?q=encebollado%2C%20lim%C3%B3n%20y%20aj%C3%AD 
?>

De manera inversa, rawurlencode() decodifica una URL con signos que habían reemplazado espacios (pero no interpreta el signo + como espacio, pues ese signo corresponde a la sintaxis de consulta en una URL):

En .PHP

<?php  
    $URLsintaxis = 'Encebollado%20y%20pan';
    echo rawurldecode($URLsintaxis);
    // Resulta en: Encebollado y pan 
?>

Convirtiendo (codificando) sintaxis URL mediante urlencode() y urldecode()

Interpretan sintaxis URL (como caracteres especiales para espacios entre palabras o tildes) y los muestra con (codifica) o sin (decodifica) según la necesidad. La codificación o decodificación evita, por ejemplo, que se pasen direcciones URL con caracteres que no podrán ser interpretados por el servidor. O por el contrario, convierten una URL para que pueda ser leída por un usuario:

En .PHP

<?php 
// CODIFICANDO  con urlencode()
    // Consulta de usuario
    $consulta = "ceviche limonada y chifle";
    // urlencode() codifica (convierte a convención)
    $url = "https://dudu.com/?mensaje=" . urlencode($consulta);

    echo $url . "<hr>";
    // https://dudu.com/?mensaje=ceviche+limonada+y+chifle 

// ... ... ... ... ... ...

// DE-CODIFICANDO con urldecode()
    $urlSintaxis = "Hola%20mundo%21%20C%C3%B3mo%20est%C3%A1s%3F";
    $textoOriginal = urldecode($urlSintaxis);

    echo $textoOriginal;
    // Hola mundo! Cómo estás? 
?>

Funciones para hallar igualdad aproximada o similar en caracteres y palabras, con metaphone() y levenshtein()

metaphone() es un algoritmo (uno o más bloques de código que ejecutan instrucciones pre diseñadas) que calcula el grado de similitud de caracteres (o de palabras) según una simulación de pronunciación que es interna (no se escucha, pero se calcula desde el algoritmo).

Así mismo, para Tatroe y MacIntyre (2020, p. 182) la función levenshtein() "calcula la similitud de dos cadenas de caracteres en función de la cantidad de caracteres que se deben agregar, sustituir o quitar para que ambas cadenas sean iguales. Por ejemplo, "cat" y "cot" tienen una distancia de Levenshtein de 1, porque solo se necesita cambiar un carácter (la "a" por una "o") para que sean iguales".

La función levenshtein() fue creada por el ruso Vladimir Levenshtein (1935-2017) en 1965 desde su tesis Binary codes capable of correcting deletions, insertions, and reversals, basado a su vez en los trabajo de R. W. Hamming en ciencias de la información y transmisión de datos. Una limitación de ese algoritmo es que solo funciona para palabras en inglés o de sustantivos más complejos. Aún así, el aporte de Levenshtein es aplicado en biología para detectar igualdad en cadenas de ADN (Berger , Waterman, Yu, 2021).

En el ejemplo de abajo, las dos funciones permiten hallar un elemento de un arreglo, incluso si el nombre de ese elemento difiere en caracteres. Pero en palabras más extensas como 'parangatirimicuaro' el algoritmo no es muy preciso:

En .PHP

<?php 

// Texto ingresado por el usuario
$palabraABuscar = "mun"; 

// Arreglo
$generos = ["punk", "rock", "parangatirimicuaro"];

// Aloja conversión con metaphone()
$calculoFonetico = metaphone($palabraABuscar);

$mejorCoincidencia = "";

/* PHP_INT_MAX es una constante predefinida en 
PHP que representa el valor entero más grande 
que puede manejar el sistema. */
$menorDistancia = PHP_INT_MAX;

// Itera arreglo, $tomo_CadaValor_deGenero capta cada valor
foreach ($generos as $tomo_CadaValor_deGenero) {
    
    // Comparar sonido con metaphone
    if (metaphone($tomo_CadaValor_deGenero) == $calculoFonetico) {
        $mejorCoincidencia = $tomo_CadaValor_deGenero;
        break;
    }
    
    // Comparar distancia con levenshtein
    $distancia = levenshtein($palabraABuscar, $tomo_CadaValor_deGenero);
    if ($distancia < $menorDistancia) {
        // Referencia al número más grande para calculo en PHP
        $menorDistancia = $distancia;
        $mejorCoincidencia = $tomo_CadaValor_deGenero;
    }
}

if ($mejorCoincidencia) {
    echo "¿Quisiste decir: $mejorCoincidencia?";
} else {
    echo "No se encontraron coincidencias.";
}

/* Cantidad de operaciones de edición o de inserción 
que se necesitan para que ambas palabras sean iguales */
echo "<hr>" . "La distancia es de " . $distancia;

/* SE MUESTRA EN PANTALLA
¿Quisiste decir: punk?
----
La distancia es de 16 
*/
?>

La función levenshtein() también calcula la cantidad de operaciones (de inserción, o de eliminación, o de reemplazo) necesarias para que dos palabras diferentes terminen siendo iguales (también llamado número levenshtein). En el caso siguiente, para que 'mun' sea igual a 'punk' se requieren dos operaciones: borrar una de las letras y añadir una letra.

En .PHP

<?php 
    $intentoDeBusqueda = "mun";
    $palabraQueBusco = "punk";

    // Aloja función levenshtein(argumento, argumento)
    $distancia = levenshtein($intentoDeBusqueda, $palabraQueBusco);
    echo "El número levenshtein es: $distancia";

    /* LAS DOS OPERACIONES NECESARIAS PARA QUE AMBAS PALABRAS SEAN IGUALES:
    - En 'mun' eliminar "m" y agregar "p" (operación 1)
        - queda pun
    - En punk añadir "k" al final
        - Queda punk
*/
?>

En la sección siguiente seguiremos revisando funciones de búsqueda de caracteres desde PHP.