Re: Converting HTML to BBCode [SOLVED]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Thank you for that - although I do have to admit that I don't 
understand a single bit of the reg-exp part. :)

It is now working flawlessly! Here is the final code I used:

-------CODE-------
<!-- Note - input textarea and submit button already coded here in 
XHTML -->
<?php

$text = '';
if ( isset($_POST['text']) ) {
    $text = $_POST['text'];
    if ( get_magic_quotes_gpc() ) {
		$text = $_POST['text'];
        $text = stripslashes($text);
    }
}

echo '<br /><br />';

/**
   * Performes BBCode conversion for some simple HTML elements
   *
   * @staticvar string  $str_http_valid
   * @staticvar array   $arr_replace
   * @param     string  $string
   * @return    string
   * @since     Mon Mar 06 23:44:40 CST 2006
   * @author    rsalazar
   */
function to_bbcode( $string ) {
  static  $str_http_valid = '-:\/a-z.0-9_%+';
          $arr_replace    = array(

"/<a\s+.*?(?<=\b)href=(?(?=['\"])(?:(['\"])(.*?)\\1)|([$str_http_valid]
*)).*?>(.+?)<\/a>/Xis"
                         => '[link=\\2\\3]\\4[/link]',

"/<img\s+.*?(?<=\b)src=(?(?=['\"])(?:(['\"])(.*?)\\1)|
([$str_http_valid]*)).*?\/?>/Xis"
                         => '[img]\\2\\3[/img]',
          '/<(\/)?(strong|em)>/Xise' => '( strcasecmp("em", "\\2") ? 
"[\\1b]" : "[\\1i]" )',
          '/<(\/?(?:b|i|u))>/Xis'  => '[\\1]',

          '/<(\/)?[ou]l>/Xis'    => '[\\1list]',
          '/<(\/)?li>/Xise'      => '( "\\1" == "" ? "[*]" : "" )',
      );
  $string = preg_replace(array_keys($arr_replace),
                         array_values($arr_replace),
                         $string);
  return  $string;
}

$text = to_bbcode($text);

echo '<textarea name="output">' . "$text" . '</textarea>';

?>
-------/CODE-------

Thank you very much for your help! I hope I get onto reg-exp and PREG 
stuff soon so that someday I might be able to understand that code.. :D

Cheers,


J_K9

> 	First of all, the back-slashes added before a " character is 
probably 
> because of the gpc_magic_quotes directive in PHP, wich tries 
to "escape" 
> the quotes (pretty stupid, if you ask me), so you must have to use 
> strip_slashes() on the string you received, e.g:
>    $text = '';
>    if ( isset($_POST['text']) ) {
>        $text = $_POST['text'];
>        if ( get_magic_quotes_gpc() ) {
>            $text = stripslashes($text);
>        }
>    }
> 
> 	Now, what you're trying to do is definetely not 
something "basic", 
> since you want to replace some non-fixed strings that can either be 
in 
> lower or uppercase (and without changing the case of the rest of the 
> text), so basicaly what you have are patterns (some kind of 'rules' 
that 
> shall be followed by the tags)
> 
> 	By your code I can tell you've already try a little the hard 
way to 
> solve this issue, although it would be quite more laborious than 
that 
> because you would have to search the string almost char-by-char (in 
a 
> figurative way, but pretty much what PHP would be doing) for all the 
> tags you want to replace, and possibly be working with two strings: 
one 
> for the original text and other with a lowercase version of it 
(since 
> you cannot search in a case-insensitive way --only in PHP5)
> 
> 	Anyway, the medium/advanced way (IMHO) would be to use regular 
> expressions.  These are quite useful, but also rather cryptic, even 
for 
> advanced users --sometimes it's easier to come up with a new one 
rather 
> than understanding what already exists :p
> 
> 	The function I've test with your test HTML-code is this one:
>    /**
>     * Performes BBCode conversion for some simple HTML elements
>     *
>     * @staticvar string  $str_http_valid
>     * @staticvar array   $arr_replace
>     * @param     string  $string
>     * @return    string
>     * @since     Mon Mar 06 23:44:40 CST 2006
>     * @author    rsalazar
>     */
>    function to_bbcode( $string ) {
>      static  $str_http_valid = '-:\/a-z.0-9_%+';
>              $arr_replace    = array(
>  
> "/<a\s+.*?(?<=\b)href=(?(?=['\"])(?:(['\"])(.*?)\\1)|
([$str_http_valid]*)).*?>(.+?)<\/a>/Xis"
>                           => '[link=\\2\\3]\\4[/link]',
>  
> "/<img\s+.*?(?<=\b)src=(?(?=['\"])(?:(['\"])(.*?)\\1)|
([$str_http_valid]*)).*?\/?>/Xis"
>                           => '[img]\\2\\3[/img]',
>            '/<(\/)?(strong|em)>/Xise' => '( strcasecmp
("em", "\\2") ? 
> "[\\1b]" : "[\\1i]" )',
>            '/<(\/?(?:b|i|u))>/Xis'  => '[\\1]',
> 
>            '/<(\/)?[ou]l>/Xis'    => '[\\1list]',
>            '/<(\/)?li>/Xise'      => '( "\\1" == "" ? "[*]" : "" )',
>          );
>      $string = preg_replace(array_keys($arr_replace),
>                             array_values($arr_replace),
>                             $string);
>      return  $string;
>    }
> 
> 	As I mentiones before, keep in mind that reg-exp can be rather 
cryptic 
> sometimes.  Also, this is the raw code, it should be optimized but 
I'm 
> feeling really lazy right now, so it should have to wait for a 
better 
> ocasion.
> 
> 	It's up to you to decide wheter you'll use this function or 
not, what I 
> would recommend you is not to forget about regexp and give them a 
try 
> later (when you're more familiar with PHP), and I would also 
recommend 
> you to use PREG family rather than EGREP.
> 

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux