Hallo Tobias,
preg_replace("/_(.*?)_/","<b>$1</b>",$str);
das ist vom Ergebnis her identisch mit meiner Lösung, verbraucht allerdings deutlich mehr Rechenzeit.
warum (ich vermute, dass du recht hast, würde nur gerne wissen, warum :-))? Lieg es an '[^_]+' <-> '.*?'
Daran. [^_] ist deutlich einfacher zu realisieren (einfach beim ersten _ aufhören), als .*?_. Bei zwei Zeichen als Begrenzung geht das natürlich nicht mehr, aber bei einem Zeichen ist das mit invertierten Zeichenklassen besser.
Viele Grüße,
Christian