Getting rid of the #038; when string replacing content

I’m trying to add some string replacements to the_title() –

function format_title($content) {
    $content = str_replace('&','&<br>', $content);
    $content = str_replace('!','!<br>', $content);
    return $content;
}
add_filter('the_title','format_title',11);

When I try and replace ampersands I get an additional “#038;” after the replacement (ASCII for ampersand), I’m not sure as to why this occurs (security reason?) or how to create a workaround. I’ve tried replacing “&” with “& amp ;” but with no effect.

The goal is to add line breaks at certain points of a title to create a better flow in the typography.
Both the database and the site has UTF8 encoding.

2 Answers
2

&#38; is essentially synonym of &amp;. In the_title filter wptexturize() runs with priority 1 (important!) and makes this replacement.

So by the time it gets to your format_title() at priority 11 – instead of replacing lone & symbol you replace (and break) chunk of &#38; character entity.

So you can:

  1. move your function to priority 0 and it will run before texturize
  2. leave priority at 11 but replace $#38; instead of just &

Leave a Comment