Tag Archives: php

Parseando HTML con PHP, ejemplo real

Los artículos sobre programación que escribo podrían dividirse en dos grupos:

  1. Artículos sobre librerías que me gustan y uso habitualmente
  2. Artículos sobre librerías que aún no he usado pero me gustaría probar en próximos proyectos que den pie a ello

Así pues, de cuando en cuando me convierto en un lector más del blog en busca de esos artículos sobre los que escribí tiempo atrás y necesito ahora. Esta vez se trataba de PHP Simple HTML DOM Parser.

Poniéndonos en contexto:
Una de las web que he iniciado recientemente trata sobre metal alternativo y myspace se ha convertido en un herramienta imprescindible a la hora de buscar noticias y fechas de conciertos. Para el tema de las noticias no había problema, el mismo myspace organiza bastante bien las noticias de los grupos de los que eres “amigo”.

Las fechas de giras en cambio eran un poco más sangrantes y no quedaba otra que visitar la ficha de los grupos una por una para dar con las nuevas fechas (esto cuando quieres cubrir más de 200 grupos puede ser un autentico infierno).

La solución:
Ya tenía la url al myspace de cada grupo en base de datos y la solución más obvia pasaba por crear un script que recogiera y parseara automáticamente el html de esta. El resultado: la tabla de conciertos del grupo mostrada directamente en el panel de administración mi página.

El código:
Como ya vimos en su día, el uso de simple HTML Dom Parser es sencillisimo (más aún si estamos familiarizados con jQuery) y bastaron unas pocas líneas para cumplir con el cometido:

$html = file_get_html($url);
$item = $html->find('div#profile_bandschedule', 0)->find("table[bgcolor=#ffffff]",0);

if($item != '')
	return '<table><tr><td>'.$item->xmltext().'</td></tr></table>';
else
	return '';

Presentación de f-engine

La presentación de hoy me hace especial ilusión, ni se las horas/días/meses que le habré dedicado a esto.

Hoy ve la luz la versión 0.1 de F-engine, un framework php de código abierto (licencia estilo BSD) basado en codeginiter.

Vídeo de presentación: Creando un blog sencillo con F-engine


Los rótulos del vídeo están en ingles pero son bastante sencillos (Si alguien encuentra fallos gramaticales se agradecería el aviso para poder corregirlos).

Diferencias con codeigniter

  • Nuevas funciones para base de datos que he llamado “quick queries”
  • Mejoras en la organización de controladores: Los controladores aceptan n sub-directorios
  • Por defecto los controladores de f-engine aceptan una sola función pública asociada a la URL (Modificable mediante la función _remap).
  • Funciones alternativas para la carga de vistas: Permite la inclusión de variables predefinidas y/o repetitivas desde ficheros externos (Especialmente útil para hojas de estilos, ficheros javascript, cabeceras o pies de página)
  • El nombre de fichero de una vista debe terminar en “_view.php” como convenio
  • F-engine no incluye ninguna biblioteca de scaffolding
  • Viene de “fabrica” con un proyecto denominado admin que incluye un puñado de aplicaciones web. Estas aplicaciones genéricas tienen como objetivo facilitar la gestión y desarrollo de los proyectos, minimizando el tiempo de programación. Destacan su gestor de bases de datos incorporado,database administrator , y new controller wizard: Aplicación para la creación de formularios basados en estructuras de bases de datos a base de clicks
  • El código base es compatible con codeigniter al 98%: No debería llevar demasiado tiempo portar proyectos CI a F-engine y viceversa


Read more

Presentación de HipHop PHP

Los rumores se han confirmado y finalmente facebook ha hecho publico el vídeo de presentación de este compilador para PHP.

La compañía lleva cerca de 6 meses usando el proyecto en sus servidores de producción con cerca de el 90% de su contenido corriendo con HipHop.

Para facilitar su uso en proyectos de terceros, futuras versiones incluirán compatibilidad con PHP 5.3 (actualmente solo 5.2) y una extensión para ser ejecuto sobre apache además del server propio sobre el que corre actualmente.

Los resultados hablan por si solos:

  • Web: 50% menos en consumo de CPU con el mismo tráfico
  • API: 30% menos de consumo de CPU con el doble de tráfico

Las mas de 300.000 líneas de código del proyecto serán publicadas proximamente en el canal de Facebook en Github

10 expresiones regulares para PHP

Las expresiones regulares son patrones que describen un conjunto de cadenas sin enumerar sus elementos. Aún y cuando su sintaxis puede resultar algo complicada si no estamos familiarizados con ella, su versatilidad y potencia hacen de las expresiones regulares un recurso imprescindible a la hora de validar los datos enviados desde un formulario web.

A continuación os dejo 5 expresiones para PHP con las que validar algunos campos comunes en la mayoría de sites.

Nombre de usuario

$nombre = "userNaME4234432_";
if (preg_match('/^[a-zd_]{4,28}$/i', $nombre)) {
    echo "Nombre de usuario válido.";
}

Dirección de email

$email = "nombre.apellido@domain.com.ar";
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$email)) {
    echo "email válido";
}

Número de teléfono (formato de Estados Unidos, Canadá y México)

$tel = "(032)555-5555";
if (preg_match('/^((?[0-9]{3,3})?|[0-9]{3,3}[-. ]?)[ ][0-9]{3,3}[-. ]?[0-9]{4,4}$/', $tel)) {
echo "teléfono válido";
}

Fechas

$string = "15/10/2009";
if (preg_match('/^d{1,2}/d{1,2}/d{4}$/', $string)) {
    echo "fecha correcta.";
}

Dirección IP

$string = "255.255.255.0";
if (preg_match(
'^(?:25[0-5]|2[0-4]d|1dd|[1-9]d|d)(?:[.](?:25[0-5]|2[0-4]d|1dd|[1-9]d|d)){3}$',
$string)) {
    echo "IP correcta.";
}

Validaciones genéricas:

String alpha numérico

preg_match("/^([a-z0-9])+$/i", $str)


Read more

Lo mejor del 2009

Apenas quedan unos días para que el 2009 llegue a su fin y parece un buen momento para echar la vista atrás y recordar algunos de los temas más destacados que hemos tratado por aquí.

PHP – MySql

Javascript / jQuery

Linux

Vídeos


Read more

Parsear HTML con PHP

PHP Simple HTML DOM Parser es una librería pensada para manipular código HTML de forma sencilla con PHP. Siguiendo una sintaxis que recuerda a jQuery, permite acceder a tags, modificar elementos HTML o extraer contenido en poquísimas lineas de código.

Veamos un par de ejemplos:

  • Acceder a elementos HTML

    // Create DOM from URL or file
    $html = file_get_html(‘http://www.google.com/’);

    // Find all images
    foreach($html->find(‘img’) as $element)
    echo $element->src . ‘<br>’;

    // Find all links
    foreach($html->find(‘a’) as $element)
    echo $element->href . ‘<br>’;

  • Modificar elementos HTML

    // Create DOM from string
    $html = str_get_html(‘<div id=”hello”>Hello</div><div id=”world”>World</div>’);

    $html->find(‘div’, 1)->class = ‘bar’;

    $html->find(‘div[id=hello]‘, 0)->innertext = ‘foo’;

    echo $html; // Output: <div id=”hello”>foo</div><div id=”world” class=”bar”>World</div>

  • Extraer contenido

    // Dump contents (without tags) from HTML
    echo file_get_html(‘http://www.google.com/’)->plaintext;

Simple HTML DOM Parser requiere PHP 5 o superior para su correcto funcionamiento y es capaz de trabajar con HTML no valido.

Web oficial de Simple HTML DOM Parser
Descargar desde sourceforge

Vía sentidoweb

Link wrapper con PHP

Hace unos meses, mientras programaba la sección noticias, me propuse implementar un link wrapper en los comentarios tal y como hace wordpress.

El script php encargado de guardar los comentarios de las noticias anula el código html-javascript antes de guardarlo en base de datos con el fin de evitar problemas de seguridad. El objetivo era simple, añadir automáticamente un <a href=”">…</a> a los links de cada comentario y tras un par de pruebas la función linkwrap quedo así:

 function linkwrap ($text) {
     return preg_replace('@((https?://|https?://www.|www.)([-\w\.]+)+(:\d+)?(/([\S/_\.]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $text);
 }

Añadir marca de agua a tus imágenes con php

Hoy descubro en sitepoint un tutorial que detalla y explica los pasos necesarios para añadir una marca de agua, al vuelo, a una imagen con php.

El script final es el siguiente:

<?php
header('content-type: image/jpeg');  

$watermark = imagecreatefrompng('watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
$image = imagecreatefromjpeg($_GET['src']);
$size = getimagesize($_GET['src']);
$dest_x = $size[0] - $watermark_width - 5;
$dest_y = $size[1] - $watermark_height - 5;
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);  

?>

Pásate por el artículo original donde se explica detalladamente cada uno de los pasos del script.

Mostrando avatares desde gravatar

Gravatar es un servicio online gratuito que asocia avatares a cuantas de email. Wordpress sin ir mas lejos hace uso del mismo para mostrar los avatares que acompañan a los comentarios en el blog.

Las ventajas son claras, un usuario con cuenta en gravatar muestra su avatar junto a sus comentarios en cualquier blog wordpress en el que posteé, además de muchas otras páginas web que hacen uso de ello.

Desde el punto de vista del desarrollador, su integración en cualquier aplicación web no puede ser más sencilla. Basta con crear un elemento img html cuyo atributo src apunte a

"http://www.gravatar.com/avatar/" . $md5_delEmail . ".jpg"

Si estamos programando en PHP la sentencia completa sería la siguiente:

"http://www.gravatar.com/avatar/" . md5($emailDelUsuario) . ".jpg"

La url acepta además algunos parámetros extra. En caso de que el usuario no tenga una cuenta creada en dicho servicio, por ejemplo, podemos definir una imagen standard por medio del parámetro d. El resultado sería el siguiente:

"http://www.gravatar.com/avatar/" . md5($emailDelUsuario) . ".jpg?d=http%3A%2%2Fproyecto-f.net.net%2img_por_defecto.jpg";

El servicio crea varios tamaños de la misma imagen para facilitar su integración en nuestros diseños. Para definir el tamaño de la imagen existe el parámetro s, recogeríamos un avatar de 90×90 pixeles llamando a la siguiente url:

"http://www.gravatar.com/avatar/" . md5($emailDelUsuario) . ".jpg?d=http%3A%2%2Fproyecto-f.net.net%2img_por_defecto.jpg&s=90";

Dado que encriptamos el email del usuario mediante el algoritmo md5 no ponemos en peligro la privacidad de nadie.

Usando + para unir arrays en PHP

Acostumbro a hacer uso de la funcion array_merge() de php para unir arrays pero hoy descubro, vía electrictoolbox, una manera aún más sencilla de hacerlo por medio de operador ‘+’.

Para el ejemplo partimos de dos array que comparten algunas elementos:

$array1 = array(
 'fruit' => 'apple',
 'vegetable' => 'carrot',
 'drink' => 'water',
 'snack' => 'chips'
);

$array2 = array(
 'fruit' => 'banana',
 'drink' => 'juice',
 'sport' => 'running'
);

Si los unimos por medio '+' de la siguiente manera:
$array3 = $array1 + $array2;
Si ahora miramos el contenido de $array3 con la funcion print_r() el resultado quedaría así:

Array
(
 [fruit] => apple
 [vegetable] => carrot
 [drink] => water
 [snack] => chips
 [sport] => running
)

Sistema de gestión de usuarios en PHP

UserCake es un sencillo sistema de gestión de usuarios desarrollado en PHP y mysql. Su objetivo es proporcionar una base para construir aplicaciones donde los usuarios puedan registrarse, legearse y editar sus datos de manera simple.

usrcake

Sus funcionalidades incluyen:

  • Login
  • Registro
  • Password perdido
  • Actualizar password
  • Actualizar detalles de usuario
  • Plantillas de email
  • seguridad SHA1 + Salt / Hash
  • Activación de cuenta
  • Grupos de usuario (Basic, id – group_name)

Incluye para ello funciones que cubren necesidades frecuentes como isUserLoggedIn() o isGroupMember($id) entre otras.

Vía webresourcesdepot

Proteger descargas con PHP

En ocasiones un proyecto requiere que ciertos ficheros solo puedan ser descargados por un perfil concreto de usuarios; usuarios registrados, admins, etc.

Ocultar los links a aquellos usuarios que no tiene acceso a estos documentos suele ser suficiente por lo general, pero debemos ser conscientes de que este método no impide que un usuario con acceso al fichero pueda compartir la url con otros.

Si este nivel de seguridad nos resulta insuficiente, una alternativa puede ser realizar las descargas por medio de un script PHP en lugar de apuntar al fichero directamente. Este método podría permitirnos incluso la descarga de ficheros que se encuentren fuera de los directorios a los que apache tiene acceso.

if($usuarioValido == true) {
$name = $_GET['file'];
header("Content-disposition: attachment; filename=$name");
header("Content-type: application/octet-stream");
readfile($directorio.'/'.$name);
} else {
echo "No puedes descargar este archivo";
}