Looking for a better way to handle this growing array used for preg_replace
You have two issues: how to represent all of the desired transformations as code, and how to perform the substitutions efficiently.

To address the data representation issue — you want to use an associative array.

$simple_replacement_patterns = array(
    '/\[b\](.*?)\[\/b\]/is' =&gt; '&lt;strong&gt;$1&lt;/strong&gt;',
    '/\[i\](.*?)\[\/i\]/is' =&gt; '&lt;em&gt;$1&lt;/em&gt;',
    '/\[u\](.*?)\[\/u\]/is' =&gt; '&lt;u&gt;$1&lt;/u&gt;',
);


However, there is a lot of redundancy there, which violates the Don't Repeat Yourself principle.  Ideally, your source code should contain just

$simple_tag_translations = array(
    'b' =&gt; 'strong',
    'i' =&gt; 'em',
    'u' =&gt; 'u',
);


… and the computer build $simple_replacement_patterns for you.

Consider mapping [b]bold text[/b] to &lt;b&gt;bold text&lt;/b&gt;, [i]italic text[/i] to &lt;i&gt;italic text&lt;/i&gt;, and [u]underlined text[/u] to &lt;u&gt;underlined text&lt;/u&gt;.  Not only would the mapping be trivial (BBCode is inspired by HTML designed to be easily translated, after all), you would also not be inferring semantic value into the style.  For example, maybe the BBCode text was italicized because it is a title in a bibliography entry, not because it is to be emphasized.