Я прочитал этот Страница PHP RegEx, но либо я что-то упускаю, что-то неправильно читаю, либо все работает не так, как они говорят. Полагаю, это один из первых двух.
$str = preg_replace("([|]\d*)", ";", $str);






Регулярное выражение должно соответствовать синтаксису Perl, что означает, что оно должно начинаться и заканчиваться одним и тем же символом (за некоторыми исключениями). Кроме того, обратная ссылка должна начинаться с двойной косой черты, чтобы избежать двойного экранирования PHP. Это должно сработать (с быстрым тестом):
$str = "asdfasdf |123123 asdf iakds |302 asdf |11";
$str = preg_replace("/([|]\d*)/", "\1;", $str);
echo $str; // prints "asdfasdf |123123; asdf iakds |302; asdf |11;"
Обратите внимание, что синтаксис обратной ссылки
$nпредпочтительнее\n. Так сказано в руководстве.