Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/09/2015, 14:28
Avatar de Fleon
Fleon
 
Fecha de Ingreso: febrero-2010
Mensajes: 138
Antigüedad: 14 años, 3 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.