• Publicidad

Ayuda con expresión regular en PHP

Todo lo relacionado con lenguajes de programación distintos de Perl: PHP, Java, C++, Ruby, Python, etc.

Ayuda con expresión regular en PHP

Notapor BigBear » 2014-09-23 17:11 @758

Hola. Estoy haciendo algo en PHP para reemplazar etiquetas en un string largo con muchos caracteres raros y otras cosas. El tema es que uso las etiquetas \[code\] como en los foros, solo que en mi caso son multifunción, detectan imágenes, Youtube y códigos scripts. El código que tengo es el siguiente:

http://pastebin.com/gpzETUtx

El problema es que no puedo reemplazar toda la variable con un cómodo preg_replace porque tengo que ver lo que hay dentro de esas etiquetas; ver si es una imagen, vídeo o código y de ahí reemplazar las etiquetas en la posición correspondiente del programa PHP, no cualquier etiqueta code. La verdad, estoy muy confundido.

¿Alguien me puede ayudar?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Ayuda con expresión regular en PHP

Notapor explorer » 2014-09-23 19:10 @840

Ese problema es prácticamente igual al que hemos resuelto hace apenas unas horas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con expresión regular en PHP

Notapor BigBear » 2014-09-23 19:15 @844

Está en Perl. ¿No me lo podrías explicar sobre cómo aplicarlo en PHP?

P.D.: ¡Qué mal este mensaje va a Programación general, es PHP, qué mal!
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Ayuda con clase PHP

Notapor BigBear » 2014-09-24 12:58 @582

Tengo la siguiente clase en PHP :

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php
  2.  
  3. /*
  4.  
  5. Noticion 0.9
  6.  
  7. (c) DOddy Hackman 2011
  8.  
  9. */
  10.  
  11.  
  12. class noticion {
  13.  
  14. private $db;
  15.  
  16. public function datos($host,$user,$pass,$db) {
  17.  
  18. $this->db = $db;
  19.  
  20. if (@mysql_connect($host,$user,$pass)) {
  21. if (@mysql_select_db($db)) {
  22. return true;
  23. }
  24. }
  25. }
  26.  
  27. public function crearcategoria($nuevacategoria) {
  28.  
  29. $todo1 = "create table categoria_$nuevacategoria (
  30. id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  31. titulo VARCHAR(255) NOT NULL,
  32. contenido TEXT NOT NULL,
  33. fecha VARCHAR(255) NOT NULL,
  34. PRIMARY KEY (id));
  35. ";
  36.  
  37. $todo2 = "create table comentarios_$nuevacategoria (
  38. id_noticia int(10),
  39. id_comentario int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  40. mensaje TEXT NOT NULL,
  41. apodo VARCHAR(255) NOT NULL,
  42. fecha VARCHAR(255) NOT NULL,
  43. PRIMARY KEY (id_comentario));
  44. ";
  45.  
  46. if (@mysql_query($todo1)) {
  47. if (@mysql_query($todo2)) {
  48. return true;
  49. }
  50. }
  51.  
  52. }
  53.  
  54. public function eliminarcategoria($eliminarcategoria) {
  55.  
  56. if (@mysql_query("DROP TABLE categoria_$eliminarcategoria")) {
  57. if (@mysql_query("DROP TABLE comentarios_$eliminarcategoria")) {
  58. return true;
  59. }
  60.  
  61. }
  62. }
  63.  
  64.  
  65. public function eliminar($id,$categoria) {
  66. if (is_numeric($id)) {
  67. if (@mysql_query("DELETE FROM categoria_$categoria where id='$id'")) {
  68. return true;
  69. }
  70. }
  71. }
  72.  
  73. public function nuevo($x_titulo,$x_contenido,$x_fecha,$categoria) {
  74. $sumo = mysql_query("SELECT MAX(id) FROM categoria_$categoria");
  75.  
  76. $s = mysql_fetch_row($sumo);
  77.  
  78. foreach ($s as $d) {
  79. $x_id = $d+1;
  80. }
  81. if (@mysql_query("INSERT INTO categoria_$categoria(id,titulo,contenido,fecha)values('$x_id','$x_titulo','$x_contenido','$x_fecha')")) {
  82. return true;
  83. }
  84. }
  85.  
  86. public function vereste($id,$categoria) {
  87. if (is_numeric($id)) {
  88. $total = array();
  89. if ($que = @mysql_query("SELECT id,titulo,contenido,fecha FROM categoria_$categoria WHERE id='$id'")) {
  90. while ($ver = @mysql_fetch_array($que)) {
  91. return array($ver[0],$ver[1],$ver[2],$ver[3]);
  92. }
  93. }
  94. }
  95. }
  96.  
  97. public function listarcategorias() {
  98.  
  99. $found = array();
  100.  
  101. if ($re = @mysql_query("show tables from ".$this->db)) {
  102.  
  103. while($dat = mysql_fetch_row($re)) {
  104. $separo = split("_",$dat[0]);
  105. array_push($found,$separo[1]);
  106. }
  107. return array($found);
  108. }
  109.  
  110. }
  111.  
  112. public function vertodo($categoria) {
  113. $total = array();
  114. if ($que = @mysql_query("SELECT id,titulo,contenido,fecha FROM categoria_$categoria")) {
  115. while ($ver = @mysql_fetch_array($que)) {
  116. array_push($total,$ver);
  117. }
  118. return array($total);
  119. }
  120. }
  121.  
  122. public function mod($categoria,$id,$tit,$con,$fech) {
  123. if (@mysql_query("UPDATE categoria_$categoria SET id='$id',titulo='$tit',contenido='$con',fecha='$fech' where id='$id'")) {
  124. return true;
  125. }
  126. }
  127.  
  128. public function crearcomentario($categoria,$id_noticia,$fecha,$apodo,$mensaje) {
  129.  
  130. $sumo = mysql_query("SELECT MAX(id_comentario) FROM comentarios_$categoria");
  131.  
  132. $s = mysql_fetch_row($sumo);
  133.  
  134. foreach ($s as $d) {
  135. $x_id = $d+1;
  136. }
  137.  
  138. if (mysql_query("INSERT INTO comentarios_$categoria(fecha,apodo,mensaje,id_noticia,id_comentario)values('$fecha','$apodo','$mensaje','$id_noticia','$x_id')")) {
  139. return true;
  140. }
  141.  
  142. }      
  143.  
  144. public function modcomentario($categoria,$id,$fecha,$apodo,$contenido) {
  145. if (@mysql_query("UPDATE comentarios_$categoria SET id_comentario='$id',fecha='$fecha',apodo='$apodo',mensaje='$contenido' where id_comentario='$id'")) {
  146. return true;
  147. }
  148. }
  149.  
  150. public function vercomentarios($categoria,$id) {
  151. $todo = array();
  152. if ($ver = @mysql_query("SELECT id_noticia,id_comentario,apodo,mensaje,fecha FROM comentarios_$categoria")) {
  153. while ($que = @mysql_fetch_array($ver)) {
  154. if ($que[0] == 1) {
  155. array_push($todo,$que);
  156. }
  157. }
  158. return array($todo);
  159. }
  160.  
  161. }
  162.  
  163.  
  164. public function borrarcomentario($categoria,$id) {
  165. if (is_numeric($id)) {
  166. if (@mysql_query("DELETE FROM comentarios_$categoria where id_comentario='$id'")) {
  167. return true;
  168. }
  169. }
  170. }
  171.  
  172.        
  173. public function close() {
  174. $test->close;
  175. }
  176.  
  177.  
  178. }
  179.  
  180. ?>
Coloreado en 0.023 segundos, usando GeSHi 1.0.8.4


Un ejemplo de uso:

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php
  2.  
  3. include_once("noticion.php");  
  4.  
  5. $name = New noticion;
  6.  
  7. if ($name->datos("localhost","root","","test")) {
  8. echo "conexion abierta<br>";
  9.  
  10. $ver = $name->vereste("123","categoria");
  11.  
  12. echo $ver[2];
  13.  
  14. }
Coloreado en 0.010 segundos, usando GeSHi 1.0.8.4


Devuelve :

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Un simple script en Perl para buscar direcciones de correo en : [+] Un archivo de texto cualquiera [+] Una pagina [+] Usando un dork en google para scanear todas las paginas encontradas con el dork [+] Lo mismo que el anterior pero en bing El codigo. [code] #!usr/bin/perl #Email Extractor 0.2 #(C) Doddy Hackman 2013 #Credits : Regex based on #http://stackoverflow.com/questions/15710275/print-email-addresses-to-a-file-in-perl #Thanks to motherconfessor & amon use LWP::UserAgent; use URI::Escape; my $nave = LWP::UserAgent->new; $nave->agent( "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12" ); $nave->timeout(10); my $buscador = qr/[A-Z0-9._%+-]+\@[A-Z0-9.-]+\.[A-Z]{2,4}/i ; # Thanks to motherconfessor & amon my @emails; head(); if ( $ARGV[0] eq "-file" ) { print "\n[+] Opening file ...\n"; if ( -f $ARGV[1] ) { my $code = openfile( $ARGV[1] ); while ( $code =~ /($buscador)/g ) { my $email = $1; push( @emails, $email ); } my @emails = repes(@emails); print "\n[+] Mails Found : " . int(@emails) . "\n"; for (@emails) { savefile( $ARGV[2], $_ ); } } else { print "\n[-] File not found\n"; } } elsif ( $ARGV[0] eq "-google" ) { print "\n[+] Searching in Google ...\n"; my @links = google( $ARGV[1], $ARGV[2] ); print "[+] Scanning [" . int(@links) . "] pages ...\n"; for my $ink (@links) { my $code = toma($ink); while ( $code =~ /($buscador)/g ) { my $email = $1; push( @emails, $email ); } } my @emails = repes(@emails); print "\n[+] Mails Found : " . int(@emails) . "\n"; for (@emails) { savefile( $ARGV[2], $_ ); } } elsif ( $ARGV[0] eq "-bing" ) { print "\n[+] Searching in Bing ...\n"; my @links = bing( $ARGV[1], $ARGV[2] ); print "[+] Scanning [" . int(@links) . "] pages ...\n"; for my $ink (@links) { my $code = toma($ink); while ( $code =~ /($buscador)/g ) { my $email = $1; push( @emails, $email ); } } my @emails = repes(@emails); print "\n[+] Mails Found : " . int(@emails) . "\n"; for (@emails) { savefile( $ARGV[3], $_ ); } } elsif ( $ARGV[0] eq "-page" ) { my $code = toma( $ARGV[1] ); print "\n[+] Loading page ...\n"; while ( $code =~ /($buscador)/g ) { my $email = $1; push( @emails, $email ); } my @emails = repes(@emails); print "\n[+] Mails Found : " . int(@emails) . "\n"; for (@emails) { savefile( $ARGV[2], $_ ); } } else { sintax(); } copyright(); # Functions sub bing { my ( $a, $b ) = @_; for ( $pages = 10 ; $pages <= $b ; $pages = $pages + 10 )
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Como ven todo feo, iba a decir todo lindo refieriendome a la clase pero da asco en todo sentido. El tema es que cuando lee la noticia que quiero me devuelve ese chorizo feo haciendo que los espacios que había se borrarán y amontonarán, obligándome a usar espacios <br> usando un foreach().

La pregunta es: ¿cómo puedo hacer que la noticia se vea normal con espacios normales sin usar<br>? ¿En dónde está el error de la clase cuando arruina todo el mensaje?

La idea es que devuelve algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Un simple script en Perl para buscar direcciones de correo en :

[+] Un archivo de texto cualquiera
[+] Una página
[+] Usando un dork en google para scanear todas las páginas encontradas con el dork
[+] Lo mismo que el anterior pero en bing

El código.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿ Alguien me puede ayudar ?
Última edición por explorer el 2014-09-24 14:09 @631, editado 2 veces en total
Razón: habia => había; borraran => borrarán; amontonaran => amontonarán; obligandome => obligándome; como => cómo; donde => dónde; estan => está; asi => así; pagina => página; codigo => código
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Ayuda con clase PHP

Notapor explorer » 2014-09-24 14:02 @626

El tema es relativamente sencillo: cuando recibimos un texto que está formateado, lo debemos guardar tal cual para luego poder verlo con el mismo formato con que lo recibimos.

En el caso del HTML, los formularios <textarea> nos devuelven los textos tal cual fueron introducidos, y así les guardamos en la base de datos.

El tema es cómo los presentamos después en una página HTML.

Si no decimos nada, los caracteres de fin de línea para HTML no significan más que caracteres de espacio, y por eso se pierde el formato original. La razón es que, originalmente, se pensó que así los textos, los párrafos, se adaptarían a los anchos de las ventanas que estuvieran usando los usuarios. Y por eso este mensaje se puede ver con distintos anchos.

Pero eso no siempre es lo que queremos, sobre todo en la transmisión de códigos, que tienen un determinado formato.

La primera solución sería intercalar un <br> delante de cada carácter de fin de línea, y sacar el texto en el HTML como un flujo de texto normal (con o sin marcas <p>).

Pero esto solo resuelve los finales de línea. El sangrado (caracteres de espacio en blanco delante de las líneas para sangrarlas) queda reducido a un solo carácter de espacio, y se pierde el formato.

De ahí la existencia de la marca <pre>: todo texto que aparezca dentro de esas marcas conservará su formato, que es lo mismo que decir que los finales de línea y todos los caracteres de espacio son visualizados de forma correcta.

Hay otras formas. Por ejemplo, en estos foros, la presencia de código, texto, y código fuente coloreado se consigue mediante complejas combinaciones de marcas <li> y un montón de estilos que definen tamaño, posición y color del texto a usar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con clase PHP

Notapor BigBear » 2014-09-24 17:30 @771

¡Ja! Ya cumplí 800 mensajes preguntándote. Ya me debes odiar xD , explorer. Gracias por la ayuda. La etiqueta <pre> solucionó todo, en gran medida, pero ahora no sé por qué el texto arreglado me traspasa la tabla. ¿Sabes cómo se llama la propiedad de las tablas para evitar que el texto atraviese la parte de izquierda a derecha?

PD : Intente con :
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. max-width:200px;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. echo '<div style="width:50px; padding:10px;">';
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4

y no funciona.
Tambien cambie el pre por li o p y vuelve a lo mismo , todo el texto amontonado.
Última edición por explorer el 2014-09-24 18:22 @807, editado 1 vez en total
Razón: cumpli => cumplí; preguntandote => preguntándote; soluciono => solucionó; se => sé; porque => por qué; como => cómo
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Control de datos

Notapor BigBear » 2014-09-25 17:06 @754

Hola. Tengo el siguiente código :

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. <?php
  2.  
  3. include_once("noticion.php");  
  4.  
  5. $name = New noticion;
  6.  
  7. if ($name->datos("localhost","root","","tester")) {
  8. echo "conexion abierta<br>";
  9.  
  10. $ver = $name->vereste("74","a");
  11.  
  12. echo "<pre>".stripslashes($ver[2])."</pre>";
  13. echo "<br>";
  14.  
  15. $ver = $name->vereste("65","b");
  16.  
  17. echo "<pre>".stripslashes($ver[2])."</pre>";
  18. echo "<br>";
  19.  
  20. }
Coloreado en 0.010 segundos, usando GeSHi 1.0.8.4

En el primer <pre> tengo un resultado con muchos \"\"\" y \"\\n\\n lo cual resuelvo rápidamente con stripslashes(). El tema es que siempre uso la misma función para todas las noticias. Si hago eso saco los \n y los convierto en n quedando algo así "n[+] Sintax : $0 <search>n"; en la segunda noticia que muestro de la misma forma. Tampoco puedo usar htmlentities porque muestro código HTML. Si lo hago las etiquetas desaparecen y se arruina todo.

¿ Cómo puedo resolver esta tortura ?
Última edición por explorer el 2014-09-25 18:10 @799, editado 2 veces en total
Razón: codigo => código; rapidamente => rápidamente; funcion => función; asi => así; html => HTML; negritas; puntos de sentencia
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Ayuda con expresión regular en PHP

Notapor explorer » 2014-09-25 18:07 @797

Es que creo que la solución no es usar stripslashes(), si no interpretar $ver[2].

Si en $ver[2] tenemos un texto con secuencias de escape, como puede ser "\n", entonces es que no es el texto original, sino una versión "escapada" del mismo.

Entonces, lo que hay que hacer es simplificar esos escapes, eval()-uando la cadena (al menos, eso es lo que se hace en Perl). De esa manera, los "\n" se transforman en los caracteres de fin de línea, y luego ya se puede pasar a <pre>.

Desconozco si PHP tiene esa facultad. Seguro que sí.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con expresión regular en PHP

Notapor BigBear » 2014-09-25 19:14 @843

Pero no son \n molestos sino que muestro codigos de programacion en perl y python.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Ayuda con expresión regular en PHP

Notapor BigBear » 2014-09-25 21:03 @919

explorer, esto es rarísimo. El error solo se produce cuando listo en un for ciertas noticias. Cuando las muestra solas no pasa nada. Filtré todos los posibles errores hasta incluso rehice la clase, pero nada. Mira este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1. $codigo = "";
  2. $codigo = stripslashes(pulir($test[2]));
  3. if(preg_match('/\"/g',$codigo)) {
  4. echo "el codigo esta podrido de barras <br>";
  5. $codigo = stripslashes($codigo);
  6. } else {
  7. echo "el código le falta barras <br>";
  8. $codigo = addslashes($codigo);
  9. }
  10.  
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4


Por alguna razón misteriosa siempre tira la condición del else pero nunca agrega ningún slash. Hasta hice como tres addslashes seguidos y nunca se le agregó ninguno, esto es rarísimo.
Última edición por explorer el 2014-09-26 03:37 @192, editado 1 vez en total
Razón: rarisimo => rarísimo; Filtre => Filtré; codigo => código; razon => razón; condicion => condición; ningun => ningún; agrego => agregó
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Siguiente

Volver a Programación en general

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados