Uso avanzado de expresiones regulares en PHP

Interesante y completo tutorial en el que se nos explica usos de las expresiones regulares que normalmente no solemos tener en cuenta:

Añadir comentarios

preg_match("/^
    (1[-\s.])?	# optional '1-', '1.' or '1'
    ( \( )?		# optional opening parenthesis
    \d{3}		# the area code
    (?(2) \) )	# if there was opening parenthesis, close it
    [-\s.]?		# followed by '-' or '.' or space
    \d{3}		# first 3 digits
    [-\s.]?		# followed by '-' or '.' or space
    \d{4}		# last 4 digits
  $/x",$number);

Callbacks

$template = preg_replace_callback('/\[(.*)\]/','my_callback',$template);  
function my_callback($matches) {  
  /* codigo */
}

‘Codicia’ de la regexp

$html = 'Hello World!';  
// note the ?'s after the *'s  
if (preg_match_all('/.*?<\/a>/',$html,$matches)) {  
  print_r($matches);  
}

Prefijos y sufijos

$pattern = '/foo(?=bar)/'; 
$pattern = '/foo(?!bar)/'; 
$pattern = '/(?

Condicionales

// if it begins with 'q', it must begin with 'qu'  
// else it must begin with 'f'  
$pattern = '/^(?(?=q)qu|f)/';

Subpatrones

preg_match('/(?PH.*) (?Pf.*)(?Pb.*)/', 'Hello foobar', $matches);  
echo "f* => " . $matches['fstar']; // prints 'f* => foo'  
echo "b* => " . $matches['bstar']; // prints 'b* => bar' 

Advanced Regular Expression Tips and Techniques

Librería PHP para oData

oData es un protocolo creado por Microsoft para obtener y actualizar datos en aplicaciones. Para ello hace uso de HTTP, AtomPub y JSON para garantizar el acceso a la información desde cualquier aplicación, servicio o almacenamiento. El cual dispone de un SDK, includo PHP.

oData

Vía / php|architect

Llamar objetos como si fueran funciones en PHP

En PHP 5.3 existe el método __invoke que permite llamar a un objeto como si se tratara de una función, y como lo mejor para entenderlo es un ejemplo, pues aquí va:


class Hola {
    public function __invoke($quien) {
        return "Hola, $quien";
    }
}
$saluda = new Hola;
echo $saluda('amigo'); // "Hola, amigo"

Una función que desconocía y que puede ser muy útil, además de ser un 25% más rápida que hacer la llamada a un método del objeto que haga lo mismo.

Vía / Phly, boy, phly

Bitly-PHP librería para trabajar con la API de Bit.ly

Bitly-PHP es una librería PHP que permite trabajar con la API de Bit.ly, pudiendo acortar URLs, extenderlas, obtener información como el thumbnail o las estadísticas.

$bitly = new Bitly(",");
$bitly->stats('http://bit.ly/b6R4Uf');
echo $bitly->getData()->clicks;

Bitly-PHP

|

Pandra: librería PHP para trabajar con Cassandra

Para aquellos que necesiten Cassandra en sus proyectos o quieran trastear con él, les vendrá muy bien esta librería basada en CRUD. Soporta las estructuras de datos ofrecida por Cassandra y sus tipos de datos:

  • Column: clave-valor y el timestamp
  • Column Family: un array asociativo que contiene columnas, el cual sólo debe tener un clave paterna
  • Super Column: practicamente igual que la Column Family, sin embargo tiene una Super Column Family como padre. Puede haber varias Super Columns para una clave
  • Super Column Family: contenedor de Super Column
  • Key ID: clave única
  • Key Space: nivel más alto, sería el equivalente a la base de datos

Un ejemplo de código sería el siguiente:

class Address extends PandraSuperColumn {
    public function init() {
        $this->addColumn('city', 'string');
        $this->addColumn('street', 'string');
        $this->addColumn('zip', 'int');
    }
}

class Addresses extends PandraSuperColumnFamily {
    public function init() {
        $this->setKeySpace('Keyspace1');
        $this->setName('Super1');
        $this->addSuper(new Address('homeAddress'));
        $this->addSuper(new Address('workAddress'));
    }
}

$keyID = 'kenlogin';

$addrs = new Addresses();
$addrs->setKeyID($keyID);

// home address
$homeAddr = $addrs->getColumn('homeAddress');
$homeAddr->setColumn('city', 'san francisco');
$homeAddr->setColumn('street', '1234 x street');
$homeAddr->setColumn('zip', '94107');

// work address
$workAddr = $addrs->getColumn('workAddress');
$workAddr->setColumn('city', 'san jose');
$workAddr->setColumn('street', '9876 y drive');

// custom labelled supercolumn
$customAddr = new Address(''customAddress');
$customAddr->setColumn('city', 'another city');
$addrs->addSuper($customAddr);

// Saving via Column Family
$addrs->save();

// Saving via Super Column,
$customAddr->setColumn('city', 'another city');
$customAddr->save();

Pandra

Redimensionado óptimo de imágenes con PHP

Redimensionar imágenes con PHP es algo de lo que se ha hablado mucho, y no voy a contar nada nuevo, pero el tutorial que enlazo me parece bastante bueno y sencillo y nos puede ahorrar el crear los métodos nosotros mismos, porque no suele ser tan sencillo como hacer un resize, sino que a veces es necesario ajustar a un tamaño en particular y si son de diferentes aspect ratio pues entonces hay que pensar si dejar espacio neutro en los laterales o arriba/abajo.

Lo único que no me gusta es que para abrir la imagen se fija en la extensión del fichero, cuando puede usarse otro método y así podremos abrir la imagen que sea, por ejemplo desde una URL.

Image Resizing Made Easy with PHP

Procesos concurrentes en PHP

Buen script que nos puede ser muy útil cuando tenemos que ejecutar varios procesos concurrentes, por ejemplo realizar tareas de administración simultáneas. Para ello es necesario utilizar la función pcntl_fork(). El ejemplo es bastante sencillo, pero podemos personalizar el número de procesos que queremos que se ejecuten concurrentemente:

$maxChildren = 4;
$numChildren = 0;
foreach($unitsOfWork as $unit) {
  $pids[$numChildren] = pcntl_fork();
  if(!$pids[$numChildren]) {
    // do work
    doWork($unit);
      posix_kill(getmypid(), 9);
    } else {
      $numChildren++;
      if($numChildren == $maxChildren) {
        pcntl_wait($status);
        $numChildren--;
      }
    }
}

PHP Forking to Concurrency with pcntl_fork()

Via / PHPDeveloper.org

|

PHPillow: librería PHP para CouchDB

PHPillow es una librería PHP que nos permite interactuar con CouchDB (base de datos documental de Apache basada en JSON).

Ahora que el NoSQL es una alternativa a las bases de datos relacionales, esta librería nos ayudará bastante a la hora de realizar nuestra aplicación, ya que el código es bastante sencillo.

class myBlogDocument extends phpillowDocument { 
  protected static $type = 'blog_entry'; 
  protected $requiredProperties = array( 'title', 'text', ); 
  public function __construct() { 
    $this->properties = array( 
      'title' => new phpillowStringValidator(), 
      'text' => new phpillowTextValidator(), 
      'comments' => new phpillowDocumentArrayValidator( 'myBlogComments' )
    ); 
    parent::__construct(); 
  } 
  protected function generateId() { 
    return $this->stringToId( $this->storage->title ); 
  } 
  protected function getType() { 
    return self::$type; 
  } 
}

PHPillow

Traduce usando Google y PHP

Interesante librería que hace uso de Google Translator para traducir un texto en un idioma a otro. Aunque el API de Google está solo en Java o Javascript, el autor de la librería ha creado un wrapper para que esté disponible desde PHP.

require_once('googleTranslate.class.php');
 
/* Initialize the class translate class */
$gt = new GoogleTranslateWrapper();
$sampleText = "Bonjour de cette partie du monde";
 
/* translate(string, to_language, from_language) */
echo $gt->translate($sampleText , "en", "fr");

Google Translation PHP wrapper