Мне нужна помощь.
У меня есть шаблон регулярного выражения PostgreSQL, например:
regexp_replace(lower(institution_title),'[[:cntrl:]]|[[[:digit:]]|[[:punct:]]|[[:blank:]]|[[:space:]|„|“|“|”"]','','g')
и мне нужна эта альтернатива в языке PHP
Потому что одна половина из postgress db, и мне нужно сравнить строки из php.
Вы можете использовать те же классы символов 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
спасибо, ребята, но я столкнулся с другой проблемой, я не могу сопоставить строки, если есть специальные символы,
Вот мой вывод 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"
Первая буква не опущена, почему-то … Я что-то упустил?