Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] preg_replace no funciona durante un ciclo while

Estas en el tema de preg_replace no funciona durante un ciclo while en el foro de PHP en Foros del Web. Pues eso tengo una funcion que reemplaza etiquetas HTML a BBC con preg_replace de PHP, el problema que tengo es que funciona perfectamente siempre y ...
  #1 (permalink)  
Antiguo 10/09/2015, 14:28
Avatar de Fleon  
Fecha de Ingreso: febrero-2010
Mensajes: 138
Antigüedad: 14 años, 2 meses
Puntos: 3
preg_replace no funciona durante un ciclo while

Pues eso tengo una funcion que reemplaza etiquetas HTML a BBC con preg_replace de PHP, el problema que tengo es que funciona perfectamente siempre y cuando es un sólo registro, pero si la utilizo mediante un ciclo while no reemplaza nada..

Esta es la funcion que reemplaza:

Código PHP:
Ver original
  1. function fixBBCTags($body)
  2. {  
  3.     //code without value pattern
  4.     $body = preg_replace('#<pre\s\&nbsp;class=(\'|")_prettyXprint\1>(.*?)<\/pre>#is','[code]$2[/code]',$body);
  5.     //normal code
  6.     $body = preg_replace('#<pre\s+class=(\'|")_prettyXprint\s+_lang-auto\s+_linenums:(?:.*?)\1>(.*?)<\/pre>#is','[code]$2[/code]',$body);
  7.     //code with value pattern
  8.     $body = preg_replace('#<pre\s+class=(\'|")_prettyXprint\s_lang-(.*?)\s_linenums:(?:.*?)\1>(.*?)<\/pre>#is','[code=$2]$3[/code]',$body);
  9.     //code with value pattern version 2
  10.     $body = preg_replace('#<pre\s+class=(\'|")_prettyXprint\s+_lang-(.*?)\1>(.*?)<\/pre>#is','[code=$2]$3[/code]',$body);
  11.     //geshi block
  12.     $body = preg_replace('#<pre\s+class=(\'|")(.*?)\sgeshi_block\1>(.*?)<\/pre>#is','[code=$2]$3[/code]',$body);
  13.     //images
  14.     $body = preg_replace('#<img\s+src=(\'|")(.*?)\1\salt=\1(?:.*?)\1>#is','[img]$2[/img]',$body);
  15.     //list decimal
  16.     $body = preg_replace('#<ul\s+class=(\'|")bbc\s+bbcol\s+decimal\1>(.*?)<\/ul>#is','[list type=decimal]$2[/list]',$body);
  17.     //normal quote
  18.     $body = preg_replace('#<blockquote\s+class=(\'|")ipsBlockquote\1>(.*?)<\/blockquote>#is','[quote]$2[/quote]',$body);
  19.     //email
  20.     $body = preg_replace('#<a\s+data-ipb=(\'|")nomediaparse\1\s+href=\1mailto:(.*?)\1>(.*?)<\/a>#is','[email]$2[/email]',$body);
  21.     //list normal
  22.     $body = preg_replace('#<ul\s+class=(\'|")bbc\1>(.*?)<\/ul>#is','[list]$2[/list]',$body);
  23.     //Center
  24.     $body = preg_replace('#<p\s+style=(\'|")text-align:center;\1>(.*?)<\/p>#is','[center]$2[/center]',$body);
  25.     //left
  26.     $body = preg_replace('#<p\s+style=(\'|")text-align:left;\1>(.*?)<\/p>#is','[left]$2[/left]',$body);
  27.     //right
  28.     $body = preg_replace('#<p\s+style=(\'|")text-align:right;\1>(.*?)<\/p>#is','[right]$2[/right]',$body);
  29.     //ftp
  30.     $body = preg_replace('#<a\s+data-ipb=(\'|")nomediaparse\1\s+href=\1ftp:(?:.*?)\1>(.*?)<\/a>#is','[ftp]$2[/ftp]',$body);
  31.     //underline
  32.     $body = preg_replace('#<u>(.*?)<\/u>#is','[u]$1[/u]',$body);
  33.     //strike
  34.     $body = preg_replace('#<strike>(.*?)<\/strike>#is','[s]$1[/s]',$body);
  35.     //superindex
  36.     $body = preg_replace('#<sup>(.*?)<\/sup>#is','[sup]$1[/sup]',$body);
  37.     //subindex
  38.     $body = preg_replace('#<sub>(.*?)<\/sub>#is','[sub]$1[/sub]',$body);
  39.     //items list
  40.     $body = preg_replace('#<li>(.*?)<\/li>#is','[li]$1[/li]',$body);
  41.     //quote with value pattern
  42.     $body = preg_replace('#<blockquote\s+class=(\'|")ipsBlockquote\1\s+data-author=\1(.*?)\1\s+data-cid=\1([0-9]+)\1\s+data-time=\1([0-9]+)\1>(.*?)<\/blockquote>#is','[quote author=$2 link=topic=.msg$3#msg$3 date=$4]$5[/quote]',$body);
  43.     //italic
  44.     $body = preg_replace('#<em>(.*?)<\/em>#is','[i]$1[/i]',$body);
  45.     //bold
  46.     $body = preg_replace('#<strong>(.*?)<\/strong>#is','[b]$1[/b]',$body);
  47.     //color
  48.     $body = preg_replace('#<span\s+style=(\'|")color:(.*?);\1>(.*?)<\/span>#is','[color=$2]$3[/color]',$body);
  49.     //font size
  50.     $body = preg_replace('#<span\s+style=(\'|")font-size:(.*?)px;\1>(.*?)<\/span>#is','[size=$2pt]$3[/size]',$body);
  51.     //font type
  52.     $body = preg_replace('#<span\s+style=(\'|")font-family:(.*?),(?:.*?);\1>(.*?)<\/span>#is','[font=$2]$3[/font]',$body);
  53.     //Url
  54.     $body = preg_replace('#<a\s+data-ipb=(\'|")nomediaparse\1\s+href=\1(.*?)\1>(.*?)<\/a>#is','[url=$2]$3[/url]',$body);
  55.     //marquee
  56.     $body = preg_replace('#<marquee>(.*?)<\/marquee>#is','[move]$1[/move]',$body);
  57.    
  58.     $body = str_replace(
  59.         array('<br>','<br />','<p>','</p>','&nbsp;'),
  60.         array("\n", "\n",'','',' '),
  61.         $body);
  62.    
  63.     return $body;
  64.  
  65. }

Y aqui la utilizo, por ahí en la línea 32:

Código PHP:
Ver original
  1. $get_posts = mysqli_query($ipb_connection,
  2.         "SELECT
  3.             p.pid AS id_msg, p.topic_id AS id_topic, p.post_date AS poster_time,
  4.             p.author_id AS id_member, SUBSTRING(t.title, 1, 255) AS subject,
  5.             SUBSTRING(p.author_name, 1, 255) AS poster_name,
  6.             SUBSTRING(p.ip_address, 1, 255) AS poster_ip,
  7.             p.use_emo AS smileys_enabled, IFNULL(p.edit_time, 0) AS modified_time,
  8.             SUBSTRING(p.edit_name, 1, 255) AS modified_name, t.forum_id AS id_board,
  9.             SUBSTRING(p.post, 1, 65534) AS body,
  10.             SUBSTRING(mem.email, 1, 255) AS poster_email, 'xx' AS icon
  11.         FROM " . $from_prefix ."posts AS p
  12.             LEFT JOIN " . $from_prefix ."topics AS t ON (t.tid = p.topic_id)
  13.             LEFT JOIN " . $from_prefix ."members AS mem ON (mem.member_id = p.author_id)
  14.             WHERE p.pid != 0
  15.             ORDER BY p.pid
  16.             LIMIT " . $i ."," . $limit);
  17.            
  18.         $messages = array();
  19.         while($row = mysqli_fetch_assoc($get_posts))
  20.         {
  21.             $messages[$row['id_msg']] = array(
  22.                 'id_msg' => $row['id_msg'],
  23.                 'id_topic' => $row['id_topic'],
  24.                 'poster_time' => $row['poster_time'],
  25.                 'id_member' => $row['id_member'],
  26.                 'subject' => $row['subject'],
  27.                 'poster_name' => $row['poster_name'],
  28.                 'poster_ip' => $row['poster_ip'],
  29.                 'smileys_enabled' => $row['smileys_enabled'],
  30.                 'modified_time' => $row['modified_time'],
  31.                 'modified_name' => $row['modified_name'],
  32.                 'id_board' => $row['id_board'],
  33.                 'body' => fixBBCTags(addslashes($row['body'])),
  34.                 'poster_email' => $row['poster_email'],
  35.                 'icon' => $row['icon'],
  36.             );
  37.         }

Anteriormente lo intenté con varios parseadores HTML con el mismo resultado, ¿qué estaré haciendo mal?, ¿habrá otra manera de hacerlo?.

Saludos.
  #2 (permalink)  
Antiguo 10/09/2015, 17:43
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: preg_replace no funciona durante un ciclo while

Has probado quitar addslashes()?, por ahí podría estar el problema.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 11/09/2015, 08:47
Avatar de Fleon  
Fecha de Ingreso: febrero-2010
Mensajes: 138
Antigüedad: 14 años, 2 meses
Puntos: 3
Respuesta: preg_replace no funciona durante un ciclo while

Estaba pensando en lo mismo, pero como luego lo necesito para insertar los datos, eso es debido que a ese array le hago un implode para el values de la consulta y ahi no puedo utilizar el addslashes.
  #4 (permalink)  
Antiguo 11/09/2015, 12:23
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: preg_replace no funciona durante un ciclo while

Em primera, addslashes no te protege de ataques SQL ni te garantiza que guardar los datos sea confiable en todos los casos, para eso existe mysqli_real_escape_string().

Aquí estás haciendo lectura, no veo la necesidad de escapar los datos, eso debes hacerlo hasta que los vayas a insertar.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 11/09/2015, 17:04
Avatar de Fleon  
Fecha de Ingreso: febrero-2010
Mensajes: 138
Antigüedad: 14 años, 2 meses
Puntos: 3
Respuesta: preg_replace no funciona durante un ciclo while

Cita:
Iniciado por Triby Ver Mensaje
Em primera, addslashes no te protege de ataques SQL ni te garantiza que guardar los datos sea confiable en todos los casos, para eso existe mysqli_real_escape_string().

Aquí estás haciendo lectura, no veo la necesidad de escapar los datos, eso debes hacerlo hasta que los vayas a insertar.
Gracias por tu tiempo Triby, el problema no era ese, sino que algunos patterns estaban mal y eso hacia que fallar todo, el caso era que los corchetes no lo pasaba como string y PHP lo asumia como un rango de algo.

Saludos.

Etiquetas: durante, html, mysql, registro, select
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 15:01.