PHP - Funcion PHP

   
Vista:

Funcion PHP

Publicado por Sebastián (7 intervenciones) el 24/09/2007 18:14:19
Hice un sistema de comentarios pero tengo una gran duda, existe alguna función para evitar que cuando un usuario ponga: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" <-- muchos caracteres juntos, la pagina se deforme?. No se si es algo posible de hacer, ni si se necesita una función para evitarlo, si me pueden aclarar las dudas se los agradeceré, saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Funcion PHP

Publicado por Nicolás (154 intervenciones) el 24/09/2007 18:30:12
La única forma es separar la palabra en 2 o más palabras. No sería nada difícil hacer una función que separe las palabras dentro de un string, el asunto es si sería correcto... Deberías especificar el largo máximo de una palabra, pero nunca va a ser el máximo correcto. Si yo quiero incluir en mi mensaje una url larga, la función me la separará en dos o mas porciones y la url dejará de ser la que yo quiero. Fíjate como funciona este foro si copio un string muy largo...

http://www.lawebdelprogramador.com/news/mostrar_new.php?id=71&texto=PHP&n1=462202&n2=0&n3=0&n4=0&n5=0&n6=0&n7=0&n8=0&n9=0&n0=0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Leandro (2 intervenciones) el 24/09/2007 19:24:46
Buenas, No estoy de acuerdo que esa sea la ùnica manera de hacerlo, si es una, pero se me ocurre que en lugar de a partir de un string tengas que crear dos mas para dividir el string, lo que puedes hacer es ir recorriendo el string caracter a caracter y cuando llegues a una cierta posicion, la que tu elijas imprimas enter, controlando que no dividas al medio una palabra, es decir si estas en dicha posicion y la misma corresponde a un espacio en blanco imprimes enter y sigues imprimiendo el string, de lo contrario tendrias que ir hacia atràs hasta el ultimo espacio blanco anterior e imprimir enter y seguir imprimiendo el string a partir de esa posicion.
Quizàs suene complicado, pero no lo es, simplemente requiere saber bien que es lo que se quiere hacer.
Saludos,
Leandro.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Sebastián (7 intervenciones) el 24/09/2007 19:56:01
Gracias por responderme:
Si entiendo lo que dicen, lo que no se muy bien es como hacerlo, o sea por ejemplo tengo la variable $comentario, donde esta todo el contenido del mensaje; ¿Cómo hago para que se de cuenta cuando una palabra por ej. tenga más de 15 carácteres, y que la tenga que cortar, metiendole un <br/> o lo que sea?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Leandro (16 intervenciones) el 24/09/2007 20:16:15
Suponiendo que 15 es lo max, entonces
si el largo de la palabra es menor o igual que 15---> imprimes la palabra,
si es mayor, podrias hacer lo siguiente:
si en la posicion 15 hay justo un espacio en blanco, imprimes hasta la posicion 15,
das <br>, y luego siguies imprimiendo a partir de esa posicion, osea la 16
Si en la posicion 15 no hay un espacio, podrias hacer un while que vaya hacia atràs hasta encontrar un espacio, supongamos que lo encontras en la posicion 12, entonces ahi imprimes hasta la posicion 12, das <br> y luego sigues impriendo a partir de la posicion 13 en adelante,Notar que esto es repetitivo, una vez que imprimes tienes que volver a hacer los controles, por lo que vas a tener que hacer un bucle para llegar hasta el final del string y a su vez conteniendo un while o algo por el estilo, adentro, para ir para atràs.
Para calcular el largo del string existe la funcion strlen()
Saludos,
Leandro.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Nicolás (154 intervenciones) el 24/09/2007 22:04:14
A mi se me ocurría algo asi...


function partir_palabra ( $palabra = "" ) {
// ESTA FUNCION DEBE PARTIR UNA PALABRA Y DEVOLVER UN STRING CON LA PALABRA SEPARADA POR ESPACIOS
// ESTA PARTE TE LA DEJO A TI
}

function truncar_palabras ( $comentario = "" ) {
$longitud = 15;
$temporal = explode(" ", $comentario);
$temp = "";
for ($i = 0; $i < count($temporal); $i++) {
if (count($temporal[$i]) > $logitud) {
$temp .= partir_palabra($temporal[$i]);
} else {
$temp .= $temporal[$i];
}
}
return $temp;
}

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Diego Romero (1450 intervenciones) el 24/09/2007 22:29:53
El problema con estas soluciones que están ofreciendo es que son altamente consumidoras de recursos. Implica hacer un recorrido por todos y cada uno de los caracteres del texto en cuestión.

Si bien esto en principio no es "malo", podría convertirse en una pesadilla de programación.

Mi solución es usar expresiones regulares. La expresión que tengo en mente es esta:

\b\w{15,}

Dice: encontrar palabras que tengan al menos 15 caracteres. No importa si la palabra tiene caracteres repetidos porque el objetivo es que una palabra muy larga no "rompa" el límite de espacio en la página ¿cierto?, entonces cualquier palabra larga podría arruinar el formato (si es que entendí bien el problema, claro).

Implementación:
<?php
$patron = "/\b\w{15,}/";
$hits = Array();
$c = preg_match_all($patron, $cadena, $hits);
var_dump($hits);
?>

En $c tienes la cantidad de palabras que cumplen la condición y en el array $hits tienes las palabras que cumplen la expresión regular, las que luego puedes reemplazar para acortarlas así:
if ($c > 0) {
for ($i=0;$i<$c; $i++) {
$h = $hits[0][$i];
$p1 = substr($h,0,14);
$p2 = substr($h,15,strlen($h));
$salida = $p1."<br>".$p2;
echo $salida; // 1
}
}

Notar que el código anterior solo corta las palabras en la posición 15, si la palabra es más larga que 30, habrá que repetir el proceso (esto se puede hacer recursivamente pero no lo haré aquí). Notar también que lo que hago es inserar un tag br en la posición 15 de la palabra pero puede ser reemplazado por un espacio y luego confiar en la función wordwrap() para que formatee mejor el texto. Esto es a gusto del consumidor ;).

Finalmente hay que reemplazar los resultados en el texto original. En el código anterior, reemplazar la línea marcada con // 1 por:

$cadena = str_replace($h,$salida,$cadena);

Listo ;).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Nicolás (154 intervenciones) el 25/09/2007 08:05:28
Si pudiera poner aplausos aquí, los pondría.
Bravo!
Aunque ahora que lo pienso... no sería mas fácil verificar desde javascript que en el campo de descripción del formulario no hayan palabras largas... o que los mensajes no se publiquen hasta que el administrador los acepte... digo, no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Diego Romero (1450 intervenciones) el 25/09/2007 16:47:27
Lo había pensado pero recordé la primera regla: nunca confies en los datos que te manda el usuario ;).

De todas formas este es un foro de PHP y aunque no lo fuera, mi solución también se puede implementar en JavaScript (JS tiene soporte para expresiones regulares aunque con la fobia que le tengo a ese "lenguaje" prefiero que lo implemente otro jajaja!).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Leandro (16 intervenciones) el 25/09/2007 12:58:16
Estimado Diego Romero, comparto tu idea, pero no veo que sea muy diferente a lo que yo habìa planteado, tu haces uso de esas funciones que lo que hacen es buscar las palabras y ver si coinciden con la exprsion regurlar ...etc ( que yo no sabìa que existìan dichas funciones) , pero esas funciones, para buscar los caracteres y comparar y todo, lo que hacen es una iteraciòn, una recursiòn o algo por el estilo, que fue mi idea, entonces desde el punto de vista de eficiencia, no me parece que sea " mejor ", pero si hablamos de facilidad, es mejor usar lo que ya estè hecho para simplificar las cosas.
Respecto a tu soluciòn, queria preguntarte unas cosas:

Para que utilizas --> var_dump($hits) ??? segùn lo que leì lo que hace esa funcion es volvar la informacion del array, pero no entiendo a que se refiere, lo imprime en pantalla?
para que haces uso de la misma?

Respecto al "matcheo" que haces con la funciòn
preg_match_all($patron, $cadena, $hits) està barbaro, pero no entiendo como formas es el patròn, es decir "/\b\w{15,}/" que quieren decir las barras, los corchetes y la coma, el 15 (me imagino que te refieres al tamaño con ese numero), pero no entinedo como funciona.
Si pudieras explicarmelo te agradesco.
Bueno compañeros, ha sido un gusto discutir ideas
Saludos,
Leandro.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Diego Romero (1450 intervenciones) el 25/09/2007 16:32:10
Respondo a la primera parte. En función de los recursos de computación usar una función interna del lenguaje es "mejor" porque el intérprete no necesita gastar tiempo interpretando código, simplemente ejecuta el codebyte de esa función.
Es posible que aún usando funciones internas el código interpretado resulte más eficiente, si para este caso se puede demostrar eso pues no tengo problemas en aceptarlo, no me sorprendería.
Yo parto de la asunción de que la función preg_match_all, al ser una función interna del lenguaje está altamente optimizada a nivel de código máquina, algo que es imposible de hacer en un lenguaje interpretado como PHP para funciones escritas por el usuario.

Respondo a tus preguntas.
Ese var_dump se me escapó :).
Pasa que para resolver tu problema me puse a programar la solución que se me ocurrió y cuando obtuve la solución que esperaba la copié tal cual. Suelo usar var_dump durante la etapa de codificación para estar seguro de que las variables tienen los valores que espero que tengan, o sea, era nada más que con fines de depuración, puedes quitarlo tranquilamente.

Respondo la siguiente pregunta.
Las expresiones regulares son un metalenguaje y como tal tiene sintaxis, cada símbolo tiene significado. Te comento, sin pretender dar un curso de regex, qué signfica cada parte de la expresión regular que usé.

\b
Significa "separador de palabra". En regex un separador de palabra es un espacio en blanco, un caracter tabulador, un salto de línea o el inicio o final de la cadena, como está al principio en esta expresión significa "que la palabra sea la primer palabra en el texto o esté precedida por un espacio en blanco, tab, crlf, etc..."
\w
Significa cualquier caracter alfanumérico. Es decir letras y números y el guión bajo.

{15,}
Las llaves indican cuántas repeticiones del símbolo anterior se considerarán, las llaves indican un rango, por ejemplo si hubiese puesto {15,30} querría decir "entre 15 y 30 veces cualquier caracter alfanumérico", pero como dejé vacío el segundo parámetro quiere decir "igual o más 15 caracteres alfanuméricos", si hubiese escrito {,15}, querría decir "no más de 15 caracteres alfanuméricos. Ten en cuenta que las llaves {} deben estar precedidas de un símbolo (o un conjunto de símbolos) para considerar su repetición.

Por último, las dos barras al principio y al final de la expresión son un requisito de PHP, le indican a la función preg_match_all dónde empieza y dónde termina la expresión regular. Porque en regex se pueden poner modificadores de significado para algunos símbolos, esos modificadores se ponen a continuación de la última barra (en mi caso no usé ninguno y ahora que lo pienso me parece que sería buena idea usar los modificadores "i" y "s" así: "/\b\w{15,}/is" ).

Mientras escribo esto se me ocurre que todo esto se puede mejorar pero creo que como ejemplo es suficiente.

El tema de expresiones regulares es muy ámplio y está bien documentado. Te siguiero que hagas una búsqueda de tutoriales y te bajes este programa que a mi me resultó extremadamente útil para "depurar" expresiones regulares:
http://weitz.de/regex-coach/
(Para Windows unicamente)

Espero haber satisfecho todas tus dudas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Leandro (16 intervenciones) el 25/09/2007 17:25:44
Gracias por la respuesta
Saludos,
Leandro.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Sebastian (7 intervenciones) el 25/09/2007 20:02:17
Bueno agradesco que me hayan intentado ayudar, acá les dejo el código que sí funciona:

$text ="Y la palabra no deben pasar de quince letras, no recuerdo ninguna palabra tan larga. Asi que simplemente probemos ADASDADASAASSDDSADADSDASDASDDADADSDASDASDASDADAS porque sino la cadena debe ser cortada";
echo preg_replace("/([^\s]{15}?)/","\\1 ", $text);

Es simple y efectivo, esta respuesta me la dió un usuario de otro foro, pero se las dejo por si alguno la necesita, saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funcion PHP

Publicado por Diego Romero (1450 intervenciones) el 25/09/2007 21:41:30
Very clever! :D.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar