来自 Postgres 正则表达式替换 PHP 语言中的匹配

Posted

技术标签:

【中文标题】来自 Postgres 正则表达式替换 PHP 语言中的匹配【英文标题】:From Postgress regexp replace match in PHP language 【发布时间】:2016-07-16 23:24:42 【问题描述】:

我需要一些帮助。

我有 PostgreSQL regexp_replace 模式,例如:

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

我需要这个 php 语言的替代方案

因为一半来自 postgress db,我还必须比较来自 php 的字符串。

【问题讨论】:

同样的正则表达式可以在 PHP 中使用,这里是它的增强版:preg_replace('/[[:cntrl:][:digit:][:punct:][:blank:][:space:]„““”"]+/u', '', strtolower(institution_title)) 请检查您的标题的拼写:wiki.postgresql.org/wiki/Identity_Guidelines 【参考方案1】:

您可以使用与 PHP PCRE 正则表达式相同的 POSIX 字符类:

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

见demo

此外,PCRE 中还有Unicode category classes。因此,您也可以尝试

preg_replace('/[\pCc\d\pP\s„““”"]+/u', '', mb_strtolower($institution_title, 'UTF-8'))

其中\pCc 代表控制字符,\d 代表数字,\pP 代表标点符号,\s 代表空格。

我也在添加 /u 修饰符来处理 Unicode 字符串。

查看regex demo

【讨论】:

我无法匹配字符串,这是我的 postgres sql 输出: SQL:select regexp_replace(lower(title),'[[:cntrl:]]|[[[:digit:]]|[[:punct:]]|[[:blank:]]|[[:space:]|„|“|“|”"]','','g') from cls_institutions SQL:"oxforduniversity" "šiauliųuniversitetas" "harwarduniversity" "žemaitijoskolegija" PHP:$institutions[] = "'".preg_replace('/[[:cntrl:][:digit:][:punct:][:blank:][:space:]„““”"]+/', '', strtolower($data[0]))."'"; PHP:"oxforduniversity", "Šiauliųuniversitetas", "harwarduniversity", "Žemaitijoskolegija", 第一个字母不是小写的,不知何故。 ..我错过了什么? 正如我在回答中所写,对于 Unicode,您需要使用 /u 正则表达式修饰符和 mb_strtolower() 将 Unicode 字母转换为小写。【参考方案2】:

伙计们,但我遇到了另一个问题,我无法匹配字符串,如果有特定的符号,

这是我的 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"

第一个字母不是小写的,不知何故……我错过了什么?

【讨论】:

以上是关于来自 Postgres 正则表达式替换 PHP 语言中的匹配的主要内容,如果未能解决你的问题,请参考以下文章

Postgres中的正则表达式查找和替换

正则表达式使用 postgres regexp_replace() 用单引号替换反斜杠和单引号

PHP正则表达式的快速学习方法

使用正则表达式在 postgres 中查找 LETTERS-NUMBER 对

php [php正则替换] PHP利用正则表达式实现手机号码中间4位用星号(*)替换显示

C# - 正则表达式匹配模式、替换和捕获行号 [来自 Txt 文件]