RegEx: удалите ненужные символы UTF-8 Safe, Quickly

Я пытаюсь удалить все, кроме допустимых букв (с любого языка) в PHP. Я использовал это:

$content=preg_replace('/[^\pL\p{Zs}]/u', '', $content);

Но это мучительно медленно. Доходит примерно в 30 раз дольше:

$content=preg_replace('/[^a-z\s]/', '', $content);

Я имею дело с большими объемами данных, поэтому действительно нецелесообразно использовать медленный метод.

Есть ли более быстрый способ сделать это?

Ответ 1

Ну, это удивительно, что это всего лишь в 30 раз медленнее, поскольку в нем нужно учитывать примерно в 1000 раз больше символов, чем просто a-z при проверке, является ли определенная точка кода буквой или нет.

Тем не менее, вы можете немного улучшить свое регулярное выражение:

$content=preg_replace('/[^\pL\p{Zs}]+/u', '', $content);

должен ускорить его, объединив соседние разделители без букв/пробелов в одну операцию замены.

Ответ 2

Вы можете попробовать использовать новую версию PCRE 8.20 с опцией --enable-jit. Это JIT скомпилирует регулярное выражение и может улучшить производительность для вас.