Dec
01
2009
0

Ejemplos de expresiones regulares en PHP

“Algunas personas cuando se enfrentan a un problema, piensan “Ya sé, voy a usar expresiones regulares”. Ahora tienen dos problemas.” –Jamie Zawinski.

Hace tiempo que quiero llevar un recordatorio útil de expresiones regulares. Para poder hacerlo finalmente no me complicaré demasiado. Asi que escribiré duplas comentario seguido de la instrucción PHP. Sin importar el nombre de la variable ni el comando usado: preg_replace, preg_match, etc.

Por ejemplo en las dos primeras reemplazamos guiones (-), tú debes darte cuenta que podría ser cualquier otro caractér. También ten en cuenta que el backslash (\) usado es para asegurar que nos referimos al guión como caractér y no al guión que define rangos (por ej: a-z).

Y por supuesto que son bienvenidas todos los aportes y correcciones. Las iré agregando de a poco.

1
2
3
4
5
6
7
8
# reemplazar por un guión (-) todo lo que no sea letra o número.
$titlePlus = preg_replace("/[^a-zA-Z0-9]/i", '-', $titlePlus);

# eliminar guiones (-) seguidos (2 ó más)
$titlePlus = preg_replace("/\-{2,}/", '', $titlePlus);

# eliminar puntos (uno ó más) al final del string
$titlePlus = preg_replace("/\.+$/", '', $titlePlus);
Escrito por NomikOS en: PHP |
Hoy 21 lectores.
Dec
01
2009
0

SheBang (sharp bang) #!

Los símbolos #! (sharp bang) aparecen en la primera línea de muchos scripts, especialmente los de perl. Tambien podemos usarlos en PHP. SheBang es un alias geek de sharp bang.

Nota: El shell es el intérprete de comandos en tu terminal linux. Generalmente bash.

Lo que hace es indicarle al shell que cargue el programa descrito a continuación de ! (bang) y que le pase el nombre del archivo (del script en que está) como primer parámetro.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# en archivo hello-world.php:
#! /usr/bin/php
<?php
echo "Hello World!\n";
?>

# hacer archivo ejecutable
chmod a+x hello-world.php

# ahora si ejecutamos
./hello-world.php

# producirá
Hello World!

Como # inicia comentarios en PHP no será tomado en cuenta por el propio interprete PHP, sólo por el shell. Incluso no es necesaria la extensión .php.

Fuente: http://c2.com/cgi/wiki?SheBang

Escrito por NomikOS en: Linux, PHP |
Hoy 22 lectores.
Oct
23
2009
0

Wordpress escapa automáticamente las comillas simples!

En wp-settings.php alrededor de la línea 581 de wordpress 2.8 encontramos:

1
2
3
4
5
6
7
8
9
10
11
12
// If already slashed, strip.
if ( get_magic_quotes_gpc() ) {
    $_GET    = stripslashes_deep($_GET   );
    $_POST   = stripslashes_deep($_POST  );
    $_COOKIE = stripslashes_deep($_COOKIE);
}

// Escape with wpdb.
$_GET    = add_magic_quotes($_GET   );
$_POST   = add_magic_quotes($_POST  );
$_COOKIE = add_magic_quotes($_COOKIE);
$_SERVER = add_magic_quotes($_SERVER);

O sea que independientemente de tu configuración en php.ini:

1
2
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

WP siempre escapará las comillas.

Luego en teoría no sería necesario usar addslashes o addslashes_gpc:

1
$keyword = addslashes_gpc(trim($_POST['keyword']));

Y siempre deberíamos usar stripslashes al reescribir datos pasados por $_POST:

1
<input type="text" name="keyword" value="<?php echo htmlspecialchars(stripslashes($_POST['keyword'])) ?>">

La verdad es que no me gusta nada. Pero no queda más que aceptarlo como una medida de seguridad adecuada para permitir la creación de tantos plugins para WP a la mayor cantidad de codificadores.

Como sea, es mejor no olvidar esta característica de WP.

Update 07/dic/2009

Parece que esto no va a tener pronta solución. Hace años que el tema está instalado:
http://core.trac.wordpress.org/ticket/5791
Quizás con la instauración de PHP 6 que elimina magic_quotes se haga por fin una revisión de esta característica de WP.

Escrito por NomikOS en: PHP, Wordpress |
Hoy 13 lectores.
Oct
01
2009
8

Actualizando php 5.2 en Centos 5

Centos 5 viene con php 5.1.6.
Hay importantes paquetes que necesitan php 5.2+ como por ejemplo phpmyadmin 3.2.2. Encontré un repositorio dedicado a esto.

Haz un nuevo archivo:

1
vi /etc/yum.repos.d/centos-test.repo

Agrega estas líneas:

1
2
3
4
5
6
[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/5/testing/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing

Ejecuta la actualización con yum

1
yum --enablerepo=c5-testing update php

Ahora lo tienes…

1
2
3
4
php -v
PHP 5.2.9 (cli) (built: Jul  8 2009 06:03:36)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies

Aprovecha de actualizar php-mcrypt para tranquilizar a phpmyadmin.

1
yum --enablerepo=c5-testing update php-mcrypt

Chequea que php-mcrypt sea de la misma version que php –5.2.9 en este caso.

1
2
3
4
rpm -qa | grep mcrypt  
mcrypt-2.6.8-1.el5
libmcrypt-2.5.8-4.el5.centos
php-mcrypt-5.2.9-2.el5.centos.3

Ahora las extensiones para php son cargadas desde sus propios archivos .ini ubicados en /etc/php.d

1
vi /etc/php.d/mcrypt.ini

Para habilitar mcrypt asegúrate de remover ; en la segunda línea.

1
2
; Enable mcrypt extension module
extension=mcrypt.so

Reinicia apache

1
service httpd restart
Escrito por NomikOS en: Linux, PHP |
Hoy 14 lectores.
Aug
30
2009
0

PHP para nostálgicos y con criterio formado

Aaaaaah! Aún recuerdo aquellos entrañables días cuando siempre eran las 11 y tanto.


Captas?,… colega… –es un chiste :\

Escrito por NomikOS en: PHP, Personal |
Hoy 10 lectores.
Aug
28
2009
0

Otro manera de usar el operador de comparación ternario en PHP

Agarra tu pecesito y ejecuta esto:

1
2
3
4
5
6
7
8
$enviar_a = array();
$ID = 'destinatario';

var_dump($enviar_a);
in_array($ID, $enviar_a) ? null : $enviar_a[] = $ID;
var_dump($enviar_a);

exit;

Funciona!

Acostumbro a usar el operador ternario “?” para asignar valores. Si no sabes que es esto revisa esto Comparison Operators y busca “Ternary Operator”.

En resúmen:

1
$val = $expresion_verdadera ? 'asignar_este_valor_si_es_verdadera' : 'asignar_este_valor_si_es_falsa';

Muchas veces me ha pasado que comienzo a escribirla cuando me doy cuenta de que no es adecuada. Ej:

1
$enviar_a[] = ! in_array($ID, $enviar_a) ? $ID : !?#

con !?# quiero decir que en ese punto me doy cuenta que aqui no habría que usar este operador. Porque que en este caso no quiero asignar nada al array, cierto?

Es decir, traduciendo el anterior código, estamos diciendo: Asignar el valor $ID al array $enviar_a sólo si es que ya no está en él. O sea, quiero rellenar este array sólo con valores nuevos –no repetir ninguno.

Pero este operador espera que pongas algo en el lugar de !?#, que es el valor que le asignarías al array $enviar_a si es que ya contiene $ID.

Bueno, lo podemos hacer así:

1
! in_array($ID, $enviar_a) ? $enviar_a[] = $ID : null;

Dime que te gustó y te muestro otra construcción tan entretenida y elegantosa como esta. d^^

Escrito por NomikOS en: PHP |
Hoy 8 lectores.
Jul
14
2009
2

Creación de URLs personalizados para plugins de wordpress

Kingkong
Creative Commons License photo credit: nxtiak

Si al escribir un plugin para wordpress debes tratar con hyperlinks porque mejor no hacerlos “pretty”, es decir sin los signos ? & =. WP nos facilita la tarea de hacerle entender que datos le hacemos pasar a través de la URL.


En suma podemos escribir urls casi con total libertad, siempre y cuando sepamos informar a WP que es lo que le queremos decir.

Por ejemplo, una url como:

1
http://nomikos.info/myplugin/compre_unas_palomitas_para_ver_la_pelicula_y_las_tengo_grandes_como_kingkong

podemos muy bien hacer que sea interpretada como:

1
2
$palomitas = 'grandes';
$pelicula = 'kingkong';

si le decimos que:

1
'compre_unas_palomitas_para_ver_la_pelicula_y_las_tengo_grandes_como_kingkong'

es igual a:

1
'compre_unas_VAR1_para_ver_la_VAR2_y_las_tengo_VALOR1_como_VALOR2'

(more…)

Escrito por NomikOS en: PHP, Wordpress | Tags: ,
Hoy 9 lectores.
Jun
17
2009
0

Función PHP para reinvertir BBCode

ls -l
Creative Commons License photo credit: madmaxx

Muy bien. Este blog se está cargando mucho a linux. Asi que aqui va una función bastante útil.

Le pedí y le pedí ayuda al taitita google pa’ que me encontrara una función que me permitiera volver a meter posts escritos en vBulletin de vuelta a la base de datos. Es decir reinvertir el proceso resultante de pasar el texto del post por bbcode. Nadie sabía nada! Hasta me registré en un sitio macanudamente llamado vBulletin Hackers. Todo para que me dijeran: just “re-post” the posts?

8O Qué? sorprendente! –pensaba agarrado del techo con las uñas.

Además que quedé bien picado con mi respetable cliente. Me demoré tanto haciendo un trabajo que al principio parecia re-fácil que se terminó choreando él –me dió un 10 como es obvio pero $0 bonus –clientes, uno no sabe si amarlos o.

Bueno, al final lo hice no más –y te aseguro papá que quedé perito en vBulletin.

Parte de ese trabajo, fué convencerme a mi mismo de que era posible obtener una función de reinversión, que en el ámbito de vBulletin arrojara siempre un resultado correcto.

Asi es, esta función funcionará muy bien en vBulletin 3.7.4 y sólo en ella lo puedo asegurar. Pero seguro que te servirá un montón para empezar la tuya propia acomodándola a un problema específico.

Aquí va. Se usan expresiones regulares y el orden es importante. Y si vas a usarla con un cliente mejor cámbiale nombre. Yo la llamaba coolText()

(Y que te aproveche mi amig@, en algún momento de desespero estuve a punto de pagar hasta US$100 para que me hicieran esta función.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
function fuckBBcode($str)
{
    # basic html
   $str = str_ireplace('<br />', '', $str);
    $str = str_ireplace('<b>', '[b]', $str);
    $str = str_ireplace('<i>', '[i]', $str);
    $str = str_ireplace('<u>', '[u]', $str);
    $str = str_ireplace('</b>', '[/b]', $str);
    $str = str_ireplace('</i>', '[/i]', $str);
    $str = str_ireplace('</u>', '[/u]', $str);

    $str = str_ireplace('<ul>', '[list]', $str);
    $str = preg_replace("/<ol type=\"(\w{1})\">/si", "[list=\\1]", $str);
    $str = str_ireplace('<li>', '[*]', $str);
    $str = str_ireplace('</ul>', '[/list]', $str);
    $str = str_ireplace('</ol>', '[/list]', $str);

    # smilies
   $str = str_ireplace('<img src="images/smilies/redface.gif" border="0" alt="" title="Embarrassment" class="inlineimg" />', ':o', $str);
    $str = str_ireplace('<img src="images/smilies/smile.gif" border="0" alt="" title="Smile" class="inlineimg" />', ':)', $str);
    $str = str_ireplace('<img src="images/smilies/frown.gif" border="0" alt="" title="Frown" class="inlineimg" />', ':(', $str);
    $str = str_ireplace('<img src="images/smilies/confused.gif" border="0" alt="" title="Confused" class="inlineimg" />', ':confused:', $str);
    $str = str_ireplace('<img src="images/smilies/mad.gif" border="0" alt="" title="Mad" class="inlineimg" />', ':mad:', $str);
    $str = str_ireplace('<img src="images/smilies/tongue.gif" border="0" alt="" title="Stick Out Tongue" class="inlineimg" />', ':p', $str);
    $str = str_ireplace('<img src="images/smilies/wink.gif" border="0" alt="" title="Wink" class="inlineimg" />', ';)', $str);
    $str = str_ireplace('<img src="images/smilies/biggrin.gif" border="0" alt="" title="Big Grin" class="inlineimg" />', ':D', $str);
    $str = str_ireplace('<img src="images/smilies/rolleyes.gif" border="0" alt="" title="Roll Eyes (Sarcastic)" class="inlineimg" />', ':rolleyes:', $str);
    $str = str_ireplace('<img src="images/smilies/cool.gif" border="0" alt="" title="Cool" class="inlineimg" />', ':cool:', $str);
    $str = str_ireplace('<img src="images/smilies/eek.gif" border="0" alt="" title="EEK!" class="inlineimg" />', ':eek:', $str);

    # colors
   $str = preg_replace("/<font color=\"([^\"]*)\">(.*?)<\/font>/si", "[color=\\1]\\2[/color]", $str);
    $str = preg_replace("/<span class=\"highlight\">(.*?)<\/span>/si", "[highlight]\\1[/highlight]", $str);

    # html code && code
   $str = preg_replace("/<div style=\"margin:20px; margin-top:5px\">\s*<div class=\"smallfont\" style=\"margin-bottom:2px\">HTML Code:<\/div>\s*<pre class=\"alt2\" dir=\"ltr\" style=\"[^\"]*\">/si", '[code]', $str);
    $str = preg_replace("/<div style=\"margin:20px; margin-top:5px\">\s*<div class=\"smallfont\" style=\"margin-bottom:2px\">Code:<\/div>\s*<pre class=\"alt2\" dir=\"ltr\" style=\"[^\"]*\">/si", '[code]', $str);
    $str = preg_replace("/<\/pre>\s*<\/div>/", '[/code]', $str);

    # php code
   $str = preg_replace("/<div style=\"margin:20px; margin-top:5px\">\s*<div class=\"smallfont\" style=\"margin-bottom:2px\">PHP Code:<\/div>\s*<div class=\"alt2\" dir=\"ltr\" style=\"[^\"]*\">\s*<code style=\"white-space:nowrap\">\s*<!-- php buffer start -->/si", '[php]', $str);
    $str = preg_replace("/<!-- php buffer end -->\s*<\/code>\s*<\/div>\s*<\/div>/", '[/php]', $str);

    # quotes
   $str = preg_replace("/<div style=\"margin:20px; margin-top:5px; \">\s*<div class=\"smallfont\" style=\"margin-bottom:2px\">Quote:<\/div>\s*<table cellpadding=\"6\" cellspacing=\"0\" border=\"0\" width=\"100%\">\s*<tr>\s*<td class=\"alt2\" style=\"border:1px inset\">\s*<div>\s*Originally Posted by <strong>([^<]*)<\/strong>\s*<a href=\"showthread\.php\?[^>]*p=(\d+)#post\d+\" rel=\"nofollow\"><img class=\"inlineimg\" src=\"images\/buttons\/viewpost\.gif\" border=\"0\" alt=\"View Post\" \/><\/a>\s*<\/div>\s*<div style=\"font-style:italic\">/si", "[quote=\\1;\\2]", $str);
    $str = preg_replace("/<div style=\"margin:20px; margin-top:5px; \">\s*<div class=\"smallfont\" style=\"margin-bottom:2px\">Quote:<\/div>\s*<table cellpadding=\"6\" cellspacing=\"0\" border=\"0\" width=\"100%\">\s*<tr>\s*<td class=\"alt2\" style=\"border:1px inset\">\s*<div>\s*Originally Posted by <strong>([^<]*)<\/strong>\s*<\/div>\s*<div style=\"font-style:italic\">\s*/si", "[quote=\\1]", $str);
    $str = preg_replace("/<div style=\"margin:20px; margin-top:5px; \">\s*<div class=\"smallfont\" style=\"margin-bottom:2px\">Quote:<\/div>\s*<table cellpadding=\"6\" cellspacing=\"0\" border=\"0\" width=\"100%\">\s*<tr>\s*<td class=\"alt2\" style=\"border:1px inset\">\s*/si", "[quote]", $str);
    $str = preg_replace("/(<\/div>\s*)?<\/td>\s*<\/tr>\s*<\/table>\s*<\/div>/", '[/quote]', $str);

    # urls && threads/posts internal linking
   $str = preg_replace("/<a[^>]*href=\"([^\"]*)\"[^>]*>([^<]*)<\/a>/si", "[url=\\1]\\2[/url]", $str);

    # mailto
   $str = preg_replace("/<a[^>]*href=\"mailto:([^\"]*)\"[^>]*>([^<]*)<\/a>/si", "[email=\\1]\\2[/email]", $str);

    # images (after quotes/smileys and others containig images: images/buttons/viewpost.gif)
   $str = preg_replace("/<img[^>]*src=\"([^\"]*)\"[^>]*>/si", "[img]\\1[/img]", $str);

    # screencast
   $str = preg_replace("/<iframe width=\"\d+\" height=\"\d+\" frameborder=\"0\" scrolling=\"no\" src=\"http:\/\/www\.screencast-o-matic\.com\/embed\?sc=(\w+)&amp;[^>]*\"><\/iframe>/si", "[screencast]\\1[/screencast]", $str);

    # clear sig
   $str = preg_replace("/<!-- sig -->.*?<!-- \/ sig -->/si", '', $str);

    # clear attachment
   $str = preg_replace("/<!-- attachments -->.*?<!-- \/ attachments -->/si", '', $str);

    # html comments
   $str = preg_replace("/<!-- \w+ -->/", '', $str);
    $str = preg_replace("/<!-- \/ \w+ -->/", '', $str);

    # clean all unmatched tags for clarity
   $str = strip_tags($str);

    # html characteres
   $str = str_replace('&quot;', '"', $str);
    $str = str_replace('&#039;', "'", $str);
    $str = str_replace('&amp;', "&", $str);

    return trim($str);
}

En realidad este código amerita hartas explicaciones, pero créeme, funciona bien. Y recuerda… el orden de ejecución es de lo más importante. No cambies nada.

Escrito por NomikOS en: PHP | Tags: ,
Hoy 4 lectores.
May
16
2009
0

Autocompletación en vim

Cuando programas en vim puedes usar C-x-o para obtener una lista de las posibles funciones, estructuras o clases que deseas escribir basada en sus primeras letras.

Por ejemplo si estás escribiendo en PHP: in_ [C-x-o] completará a in_array()
(more…)

Escrito por NomikOS en: Linux, PHP | Tags:
Hoy 7 lectores.
May
16
2009
0

Función PHP para transformar fechas formateadas a unixtime

Función para transformar fechas formateadas a unixtime. En este historico momento son las:

1
2
3
4
<?php
echo time();
# 1242485685
?>

Unixtime es el tiempo en segundos desde el 1/1/1970 y es muy útil para almacenar y procesar fechas.
Por lo mismo no es adecuado para fechas anteriores. Por ejemplo para fechas de nacimiento. (more…)

Escrito por NomikOS en: PHP | Tags: ,
Hoy 10 lectores.

Powered by WordPress. Theme: TheBuckmaker. Modifications by NomikOS