public function format_characters($str)
{
static $table;
if (!isset($table)) {
$table = array('/\'"(\\s|$)/' => '’”$1', '/(^|\\s|<p>)\'"/' => '$1‘“', '/\'"(\\W)/' => '’”$1', '/(\\W)\'"/' => '$1‘“', '/"\'(\\s|$)/' => '”’$1', '/(^|\\s|<p>)"\'/' => '$1“‘', '/"\'(\\W)/' => '”’$1', '/(\\W)"\'/' => '$1“‘', '/\'(\\s|$)/' => '’$1', '/(^|\\s|<p>)\'/' => '$1‘', '/\'(\\W)/' => '’$1', '/(\\W)\'/' => '$1‘', '/"(\\s|$)/' => '”$1', '/(^|\\s|<p>)"/' => '$1“', '/"(\\W)/' => '”$1', '/(\\W)"/' => '$1“', "/(\\w)'(\\w)/" => '$1’$2', '/\\s?\\-\\-\\s?/' => '—', '/(\\w)\\.{3}/' => '$1…', '/(\\W) /' => '$1 ', '/&(?!#?[a-zA-Z0-9]{2,};)/' => '&');
}
return preg_replace(array_keys($table), $table, $str);
}