Cosa fa [^\pL] ? Ho cercato in rete ma le spiegazioni non erano chiare.

Puoi forse cavartela con print preg_replace('/[^a-zA-Z0-9_]/u', '_', $str );