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

Expresiones regulares con filtros en PHP

Buena alternativa para validar variables usando expresiones regulares usando filtros:

  • Validar números reales
$values= array(10.75, '10.75', -1234.5678, 'This is a string', array());
$filteredValues = filter_var($values, FILTER_VALIDATE_FLOAT, FILTER_REQUIRE_ARRAY);
  • Validar expresiones regulares
if(filter_var($value, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => "/^G(.+)/")))) {
// Lo que sea
}
  • Validar URLs
$url = 'http://www.devshed.com';
if(filter_var($url, FILTER_VALIDATE_URL)) {
// Lo que sea
}

Working with Regular Expressions with Filters in PHP 5

5 expresiones regulares útiles para desarrollo web

Aunque a algunos nos gustan bastante las expresiones regulares, no está mal ofrecer una lista de alguna de ellas que nos pueden ser útiles cuando desarrollamos aplicaciones web.

  • Usuario: está es sencilla, letras, dígitos y el subrayado, con una longitud entre 3 y 16 caracteres.
/^[a-zA-Z0-9_]{3,16}$/
  • Etiquetas XHTML: habrá que sustituir la palabra etiqueta por la correspondiente que queremos buscar.
/]*>(.*?)<\/etiqueta>/
  • Etiqueta con atributos: lo mismo que la anterior pero con atributos.
/]*atributo\s*=\s*(["'])valor\\1[^>]*>(.*?)<\/etiqueta>/
  • Direcciones de correo: según la especificación RFC 822:
function is_valid_email_address($email){
$qtext = '[^\x0d\x22\x5c\x80-\xff]';
$dtext = '[^\x0d\x5b-\x5d\x80-\xff]';
$atom = '[^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c'.
'\x3e\x40\x5b-\x5d\x7f-\xff]+';
$quoted_pair = '\x5c[\x00-\x7f]';
$domain_literal = "\x5b($dtext|$quoted_pair)*\x5d";
$quoted_string = "\x22($qtext|$quoted_pair)*\x22";
$domain_ref = $atom;
$sub_domain = "($domain_ref|$domain_literal)";
$word = "($atom|$quoted_string)";
$domain = "$sub_domain(\x2e$sub_domain)*";
$local_part = "$word(\x2e$word)*";
$addr_spec = "$local_part\x40$domain";
return preg_match("!^$addr_spec$!", $email) ? 1 : 0;
}
  • URL: para reconocer direcciones de internet:
{
\b
# Parte principal (protocolo://dominio, o solo dominio)
(
# http://, o https://
(https?)://[-\w]+(\.\w[-\w]*)+
|
# Nombre de dominio
(?i: [a-z0-9] (?:[-a-z0-9]*[a-z0-9])? \. )+ # subdominions
# .com, .net...
(?-i: com\b
| edu\b
| biz\b
| gov\b
| in(?:t|fo)\b # .int or .info
| mil\b
| net\b
| org\b
| [a-z][a-z]\.[a-z][a-z]\b # two-letter country code
)
)
# Puerto
( : \d+ )?
# El resto es opcional que empieza por /
(
/
[^.!,?;"\'<>()[]{}sx7F-\xFF]*
(
[.!,?]+ [^.!,?;”\’<>()\[\]{\}s\x7F-\xFF]+
)*
)?
}ix

5 Regular Expressions Every Web Programmer Should Know

Vía / dzone

Expresiones regulares en PHP

Creo que uno de los mejores inventos en la programación son las expresiones regulares, en otra ocasión ya hemos hablado de ellas, pero esta vez os mostramos un enlace bastante interesante en el que se nos explica su uso en PHP.
Aunque no se trata solamente del uso de funciones, sino también una lista de recursos, como este manual de expresiones regulares en Perl, en el cual recomiendo el apartado sobre grupos no capturables (no los solemos usar pero creo que son fundamentables), y también nos habla de la diferencia entre expresiones regulares POSIX y compatibles con Perl.
Se trata de un primer artículo y al menos deberá haber uno más, que espero sea tan bueno como este.
The Joy of Regular Expressions [1]
The Joy of Regular Expressions [2] (actualización)
The Joy of Regular Expressions [3] (actualización)

Regulazy: una ayuda para tus expresiones regulares

Supongo que no todo el mundo es un adicto a las expresiones regulares como lo puedo ser yo, y la verdad es que si no te gustan, son un poco difíciles de entender. Si eres de ese grupo, te vendrá bastante bien una aplicación que te ayude con las expresiones regulares: Regulazy.
RegulazyDemo.gif
El funcionamiento es sencillo, escribes una frase, la cual debería reconocer la expresión regular y luego modificas las partes indicando si quieres que reconozca tal palabra de forma exacta, o si realmente puede ser una unión de números y letras, o si puede ser cualquier cosa.
Regulazy
Vía / SitePoint