将[b]转换为<b>

I don't have much experience at all with patterns and preg_replace so I know I'm doing it wrong. But I'm not sure what the proper syntax should be.

In this instance I'm trying to convert [/b] to from a form submission.

Here's my best attempt, which obviously is incorrect:

    $patterns = array();
    $patterns[0] = '/[b]/';
    $patterns[1] = '/[/b]/';
    $patterns[2] = '/[i]/';
    $patterns[3] = '/[/i]/';
    $patterns[4] = '/[u]/';
    $patterns[5] = '/[/u]/';
  $replace = array();
    $replace[0] = '/<b>/';
    $replace[1] = '/</b>/';
    $replace[2] = '/<i>/';
    $replace[3] = '/</i>/';
    $replace[4] = '/<u>/';
    $replace[5] = '/</u>/';
  $new = preg_replace($patterns, $replace, $string);

This might be done more simply using str_replace()

$search  = array('[b]', '[/b]', '[i]', '[/i]');
$replace = array('<b>', '</b>', '<i>', '</i>');

str_replace($search, $replace, $string );
  1. Replace doesn't need delimiters.
  2. This doesn't need to be a regex, you could do this with str_replace.
  3. The [ and ] are special charachters in regex so they need to be escaped.
  4. Anywhere you use a delimiter as the character in the regex it needs to be escaped.
  5. All these solutions below are case sensitive. If you allow for capitals as well the i modifier should be used for the regex and the str_ireplace should be used in place of str_replace.

Example 1:

$patterns = array();
$patterns[0] = '/\[b\]/';
$patterns[1] = '/\[\/b\]/';
$patterns[2] = '/\[i\]/';
$patterns[3] = '/\[\/i\]/';
$patterns[4] = '/\[u\]/';
$patterns[5] = '/\[\/u\]/';
$replace = array();
$replace[0] = '<b>';
$replace[1] = '</b>';
$replace[2] = '<i>';
$replace[3] = '</i>';
$replace[4] = '<u>';
$replace[5] = '</u>';
$new = preg_replace($patterns, $replace, $string);

If you want it with a regex though use the regex functionality.

$patterns = array();
$patterns[0] = '/\[(\/?)b\]/';
$patterns[1] = '/\[(\/?)i\]/';
$patterns[2] = '/\[(\/?)u\]/';
$replace = array();
$replace[0] = '<$1b>';
$replace[1] = '<$1i>';
$replace[2] = '<$1u>';
$new = preg_replace($patterns, $replace, $string); 

or with str_replace...

 $patterns = array();
 $patterns[0] = '[b]';
 $patterns[1] = '[/b]';
 $patterns[2] = '[i]';
 $patterns[3] = '[/i]';
 $patterns[4] = '[u]';
 $patterns[5] = '[/u]';
 $replace = array();
 $replace[0] = '<b>';
 $replace[1] = '</b>';
 $replace[2] = '<i>';
 $replace[3] = '</i>';
 $replace[4] = '<u>';
 $replace[5] = '</u>';
 $new = str_replace($patterns, $replace, $string);

A better regex...

$new = preg_replace('~\[(/?)(b|i|u)\]~', '<$1$2>', $string);