regex — из Postgress regexp заменяет совпадение на языке PHP

Мне нужна помощь.

У меня есть шаблон регулярного выражения PostgreSQL, например:

 regexp_replace(lower(institution_title),'[[:cntrl:]]|[[[:digit:]]|[[:punct:]]|[[:blank:]]|[[:space:]|„|“|“|”"]','','g')

и мне нужна эта альтернатива в языке PHP

Потому что одна половина из postgress db, и мне нужно сравнить строки из php.

1

Решение

Вы можете использовать те же классы символов POSIX с регулярным выражением PHP PCRE:

preg_replace('/[[:cntrl:][:digit:][:punct:][:blank:][:space:]„““”"]+/', '', strtolower($institution_title))

Увидеть демонстрация

Кроме того, есть Классы Unicode категории в PCRE. Таким образом, вы также можете попробовать

preg_replace('/[\p{Cc}\d\p{P}\s„““”"]+/u', '', mb_strtolower($institution_title, 'UTF-8'))

куда \p{Cc} обозначает управляющие символы, \d для цифр, \p{P} для пунктуации и \s для пробелов.

Я добавляю /u модификатор для обработки строк Unicode тоже.

См regex demo

1

Другие решения

спасибо, ребята, но я столкнулся с другой проблемой, я не могу сопоставить строки, если есть специальные символы,

Вот мой вывод Postgres SQL:

SQL:

select regexp_replace(lower(title),'[[:cntrl:]]|[[[:digit:]]|[[:punct:]]|[[:blank:]]|[[:space:]|„|“|“|”"]','','g')
from cls_institutions

Выход:

"oxforduniversity""šiauliųuniversitetas""harwarduniversity""internationalbusinessschool""vilniuscollege""žemaitijoskolegija""worldhealthorganization"

Но в PHP вывод немного отличается: я получил свой массив с учреждениями:

$institutions[] = "'".preg_replace('/[[:cntrl:][:digit:][:punct:][:blank:][:space:]„““”"]+/', '', strtolower($data[0]))."'";

И вывод PHP так:

"oxforduniversity",
"Šiauliųuniversitetas",
"harwarduniversity",
"internationalbusinessschool",
"vilniuscollege",
"Žemaitijoskolegija",
"worldhealthorganization"

Первая буква не опущена, почему-то … Я что-то упустил?

0

По вопросам рекламы [email protected]