sábado, 4 de septiembre de 2010

Sustitución de subcadenas con PHP

Más recursos para el manejo de strings str_replace() y substr_replace(). Sirven básicamente para buscar y reemplazar cadenas.

//podemos utilizar una variable o un array
//para indicar los terminos buscados
$arr_busca = array("hola", "clavel", "corazón");
$arr_reemplaza = array("adiós", "flor", "amor");
str_replace($arr_busca, $arr_reemplaza, "hola clavel, adiós corazón");
//resulta
adiós flor, adiós amor

Del mismo modo la función substr_replace permite buscar y reemplazar una subcadena de una cadena en función de su posición. Espera los parámetros: cadena, sustitución, inicio y longitud. Si el valor del parámetro inicio es positivo o 0 el desplazamiento se calcula desde el principio, si es negativo se establece con respecto al final de la cadena. El valor de longitud representa el número de caracteres que será sustituido, si es 0 la cadena de sustitución se inserta sin sobreescribir la cadena existente, si este es negativo representa el punto donde se dentendrá la sustitución.

$var = substr_replace($str, 'hola', 2, 0); 

Funciones prácticas para manipular cadenas con PHP

La manipulación de cadenas de texto es una de las tareas más comunes a la hora de trabajar con PHP. Este lenguaje incorpora de forma nativa un buen número de funciones que nos facilitan enormemente el manejo de strings. Vamos a repasar algunas de estas las funciones para manipular cadenas más comunes.

Función Descripción
strtoupper() Convierte la cadena pasada como parámetro en mayúsculas.
strtolower() Convierte la cadena en minúsculas.
ucfirst() Pone en mayúsculas el primer carácter de la cadena.
ucwords() Pone en mayúsculas la primera letra de cada palabra.
addslashes() Escapa carácteres especiales agregando la barra invertida correspondiente.
stripslashes() Elimina las barras de escape.

Ejemplos de uso de otras funciones.

//substr() retorna una subcadena a partir
//de los puntos indicados como parámetro incial y final
$var = substr("hola que tal", 1);
//devuelve
ola que tal

//si el valor inicio es negativo
//devuelve la parte final de la cadena
//con los caracteres indicados
substr("hola que tal", -3);
//devueve
tal

//el parámetro longitud sirve para
//indicar el número de carácteres a devolver
//si es positivo o la posición final de la
//secuencia de retorno si es negativo
substr("hola que tal", 0, 4);
//devuelve
hola
substr("hola que tal", 0, -4);
//devuelve
hola que

Para buscar subcadenas dentro de otras cadenas utilizamos strstr(), que espera que le pasemos 2 parámetros, primero el texto donde buscar y segundo el texto buscado. Devuelve el texto pasado como parámetro número 1 desde la posición donde se haya encontrado la cadena buscada o false en caso de no encontrarla.

$cadena = "En un lugar de la mancha";
echo strstr($cadena, "lugar");
//devuelve
lugar de la mancha

Para obtener la posición de una subcadena utilizaremos strpos() y strrpos() que funcionan básicamente igual que strstr() con la diferencia de que en lugar de devolver una subcadena devuelve su posición numérica.

$cadena = "En un lugar de la mancha";
echo strpos($cadena, "un");
//imprime 3 ya que 3 es la
//posición que ocupa "un" en la
//cadena principal

//podemos emplear un tercer parámetro
//que sirve para indicar la posición
//a partir de la cual comenzamos a buscar
echo strpos($cadena, "n", 3);
//devuelve 4 ya que no se ha tenido en cuenta
//la primera n de "En"

La función strrpos() realiza la misma tarea pero retorna la posición de la última coincidencia en lugar de la primera. Estas dos funciones devolverán false si no encuentran la subcadena buscada. Importante: utilizar comparaciones estrictas y el operador === para evitar falsos positivos.

sábado, 21 de agosto de 2010

Equivalente a strip_tags en ASP clásico

PHP nos tiene acostumbrados a facilitarnos todo tipo de tareas, incluyendo funciones útiles para cualquier propósito de forma nativa, algo que no ocurre en ASP que te obliga a fabricarte tus propias subrutinas "a mano".

Por ejemplo en ASP clásico no existe un equivalente para strip_tags() que elimina los tags HTML a la cadena que se le pase como parámetro.

Aquí tienes dos funciones que hacen esto utilizando expresiones regulares:

'devuelve la cadena totalmente limpia de tags HTML
Function strip_tags(strHTML)
    Dim regEx
    Set regEx = New RegExp
    With regEx
       .Pattern = "<(.|\n)+?>"
       .IgnoreCase = true
       .Global = true
    End With
    strip_tags = regEx.replace(strHTML, "")
    Set regEx = Nothing
End Function

'Esta segunda funcion permite pasar
'una lista de tags admitidos
Function strip_tags(strHTML, allowedTags)
   Dim objRegExp, strOutput
   Set objRegExp = New regexp
   strOutput = strHTML
   allowedTags = "," & LCase(Replace(allowedTags, " ", "")) & ","

   objRegExp.IgnoreCase = true
   objRegExp.Global = true
   objRegExp.MultiLine = true
   objRegExp.Pattern = "<(.|\n)+?>"
   Set matches = objRegExp.execute(strHTML)
   objRegExp.Pattern = "<(/?)(\w+)[^>]*>"

   For Each match In matches
      tagName = objRegExp.Replace(match.value, "$2")
      If instr(allowedTags, "," & lcase(tagName) & ",") = 0 then
         strOutput = replace(strOutput, match.value, "")
      End If
   Next

   strip_tags = strOutput
   Set objRegExp = Nothing
End Function
miércoles, 11 de agosto de 2010

Eliminar acentos y otros caracteres con ASP clásico

Una práctica función en asp clásico (vbscript) que sustituye vocales acentuadas y otros caracteres por el equivalente que se elija.

Function EliminarAcentos(texto)

    Dim i, s1, s2
    s1 = "ÁÀÉÈÍÏÓÒÚÜáàèéíïóòúüñç"
    s2 = "AAEEIIOOUUaaeeiioouunc"
    If Len(texto) <> 0 Then
        For i = 1 To Len(s1)
            texto = Replace(texto, Mid(s1,i,1), Mid(s2,i,1))
        Next
    End If
    
    EliminarAcentos = texto

End Function

Esta otra función es bastante más completa, utiliza además expresiones regulares para eliminar cualquier caracter no permitido en una URL, lo que nos permite limpiar o formatear una cadena de texto para su uso como URL amigable hacia una página concreta de nuestro sitio web.

Function LimpiarUrl(ByVal texto)
    
    Dim objRegExp
    Set objRegExp = New Regexp
    
    objRegExp.IgnoreCase = True
    objRegExp.Global = True
    
    objRegExp.Pattern = "\s+"
    texto = objRegExp.Replace(texto, " ")
    
    objRegExp.Pattern = "[(?*"",\\<>&#~%{}+.@:\/!;']+"
    texto = objRegExp.Replace(texto, "")
    
    Dim i, s1, s2
    s1 = "ÁÀÉÈÍÏÓÒÚÜáàèéíïóòúüñç "
    s2 = "AAEEIIOOUUaaeeiioouunc-"
    If Len(texto) <> 0 Then
        For i = 1 To Len(s1)
            texto = Replace(texto, Mid(s1,i,1), Mid(s2,i,1))
        Next
    End If

    LimpiarUrl = LCase(texto)

End Function