Foros del Web » Programando para Internet » PHP »

Expresiones regulares

Estas en el tema de Expresiones regulares en el foro de PHP en Foros del Web. Hola. Me gustaria saber si con expresiones regulares se puede hacer lo que hasta ahora hago a mano, recorriendo palabra por palabra de mi texto ...
  #1 (permalink)  
Antiguo 12/11/2003, 01:38
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Expresiones regulares

Hola.
Me gustaria saber si con expresiones regulares se puede hacer lo que hasta ahora hago a mano, recorriendo palabra por palabra de mi texto (de mas esta decir que de exp. reg. cero). El tema es asi: En los perfiles de los miembros no permito que ingresen palabras de mas de 40 caracteres de longitud, para evitar que me deformen las tablas. Lo que hago es cortar a 40 caracteres las que sobrepasan esta longitud.
Se puede hacer con expresiones?
  #2 (permalink)  
Antiguo 12/11/2003, 03:06
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Revisa wrodwarp() (www.php.net/wordwarp), a ver si te sirve.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 12/11/2003, 03:09
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Mmmm no, no le veo relacion con lo que necesito. Gracias igual.
  #4 (permalink)  
Antiguo 12/11/2003, 04:59
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Aver... creo que sí tiene que ver, porque esa función inserta un salto de línea.. de esa forma tu tabla tendrá siempre un acho máximo definido...

Y lo de hacerlo "a mano"... se me ocurre así:
Código PHP:
$texto="palabras de 40 caracteresmildoscientoscuarentayochocaracteresynoseharotolacadenaestadeaca no se si existan aca... 
De todas maneras buscamos pues algunas que te 
parecesi buscamos una que otra"
;
echo 
"<b>Texto sin modificar:</b><br />\n";
echo 
$texto."<br />";
$a=explode(' '$texto);
foreach(
$a as $indice=>$palabra){
    if(
strlen($palabra)>40){
        
$a[$indice]=substr($palabra040);
    }
}
$texto=implode(' '$a);
echo 
"<b>texto modificado:</b><br />\n";
echo 
$texto."<br />"
Lo que no sé es de qué te sirven las palabras cortadas así como quedarían. A menos que TODA TU CADENA (y no las palabras) deba tener 40 caracteres como máximo. En ese caso sería más sencill. Bastaría con sólo poner
Código PHP:
$texto=substr($texto,0,40); 
Hay que fijarse que los saltos de línea se cuentan como caracteres. Además, las etiquetas HTML se cuentan como caracteres (ej: <br> tiene 4 caracteres), pero no se visualizan con el "echo".

Saludos

Última edición por jpinedo; 12/11/2003 a las 05:19
  #5 (permalink)  
Antiguo 12/11/2003, 15:06
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Lamentablemente sigue sin ser lo que busco. Voy a explicar un poquito mejor mi situacion, pero repito: necesito expresiones regulares, si es que se puede

No me sirve dejar saltos porque esto lo implemento en los datos personales de los miembros. Y ahora lo estoy haciendo a mano de una forma muy parecida a la que propone jpinedo. Si un usuario pone "holaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" no quiero meter un salto, le quiero cortar la palabra a "holaaaaaaaa". Soy muy estricto en ese sentido, si alguien se registra para poner tonterias en su perfil se las corto, y hasta evaluo luego si el usuario sigue habilitado.

Bueno, es eso, lo que jpinedo puso y que yo ya hago a mano, queria saber si es posible con expresiones, para no recorrer palabra por palabra en el texto.
  #6 (permalink)  
Antiguo 12/11/2003, 15:30
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Vale, pensaba que lo unico que querias era que no se descuadraran las tablas.

Bueno, una pequeña mirada a preg_replace() (www.php.net/preg_replace) y haciendo un par de pruebas, he sacado esto:

<?php
$texto="hola 123456789 dfdsfs dsfsdfsdfsdfsdfsd.\ndfsdfsdfsdfsdfsdfsdfsdfs. dfsd\n123";
$nuevo=preg_replace("/(\w+)/e","(7<strlen('\\1'))?substr('\\1',0,7):'\\1'",$te xto);
echo "Original:<br><br>".nl2br($texto).'<br><br>';
echo "Modificado:<br><br>".nl2br($nuevo).'<br><br>' ;
?>

Usando el modificador 'e' se puede poner codigo PHP en la expresion a poner. El (\w+) es para seleccionar palabras. Y la expresion nueva es codigo PHP usando el valor codigo por la primera expresion en \\1.

No se si servira para todos los casos de chorraras que puedan tener.

Espero que te sirva.

Suerte.

<editado>La etiqueta [ PHP ] con expersiones regulares se come \.</editado>
__________________
Josemi

Aprendiz de mucho, maestro de poco.

Última edición por josemi; 12/11/2003 a las 15:32
  #7 (permalink)  
Antiguo 12/11/2003, 23:42
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
La verdad muy bien no lo entiendo porque nunca me lleve del todo bien con las expresiones regulares, pero lo voy a probar para ver como anda.

Muchas gracias josemi
  #8 (permalink)  
Antiguo 15/11/2003, 17:03
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
josemi: anda perfecto!

Ahora bien, como supiste la forma en que debia ir redactado el codigo php en el segundo parametro de la funcion? Me interesaria saber mas acerca de eso, para en el futuro usarlo para mas cosas.
  #9 (permalink)  
Antiguo 16/11/2003, 15:24
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Pues de donde siempre, del manaul . Si te fijas al final de preg_replace() (www.php.net/preg_replace), te pone este ejemplo:

<?php
preg_replace ("/(<\/?)(\w+)([^>]*>)/e",
"'\\1'.strtoupper('\\2').'\\3'",
$html_body);
?>

Sabiendo lo que son el \\1, \\2 y \\3 y experimentando un poco, se llega al codigo que puse yo

(7<strlen('\\1'))?substr('\\1',0,7):'\\1'

Bueno, he de reconocer que soy un poco "tramposo". Como pensaba que no iba a permitir varias lineas de codigo, me aproveche de mi querido operador ternario (http://www.php.net/manual/en/languag...comparison.php), que me permite tener un if...else... en una sola linea.

Ya sabes, "Mas sabe el zorro por viejo que por zorro"

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #10 (permalink)  
Antiguo 16/11/2003, 22:57
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Buenisimo! Gracias!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:39.