PHP正则表达式无法处理数据库中的字符串
PHP正则表达式无法处理数据库中的字符串,php,regex,Php,Regex,preg_replace在从数据库获取的字符串上使用时,不会返回所需的结果 $result = DB::connection("connection")->select("my query"); foreach($result as $row){ //prints run-d.m.c. print($row->artist . "\n"); //should print run.d.m.c //prints run-d.m.c print(
preg_replace
在从数据库获取的字符串上使用时,不会返回所需的结果
$result = DB::connection("connection")->select("my query");
foreach($result as $row){
//prints run-d.m.c.
print($row->artist . "\n");
//should print run.d.m.c
//prints run-d.m.c
print(preg_replace("/-/", ".", $row->artist) . "\n");
}
仅当我尝试替换-
(破折号)时才会发生这种情况。我可以替换任何其他角色。
但是,如果我在简单字符串上尝试此正则表达式,它将按预期工作:
$str = "run-d.m.c";
//prints run.d.m.c
print(preg_replace("/-/", ".", $str) . "\n");
我在这里遗漏了什么?原来字符串中有Unicode破折号。要匹配所有Unicode破折号,请使用
/[\p{Pd}\xAD]/u
见
\p{Pd}
与中的任何连字符匹配,但不匹配软连字符\xAD
,因此它应该与字符类中的\p{Pd}
组合
/u
修饰符使模式识别Unicode,并使正则表达式引擎将输入字符串视为Unicode代码点序列,而不是字节序列。如果使用'/\p{Pd}/'
模式,是否匹配连字符/破折号?不,仍然打印相同的字符串,那么字符串中可能没有-
。不确定是否有帮助,请尝试添加/u
修饰符,/\p{Pd}/u
。能否显示确切的输出?看起来像破折号的东西实际上可能是负号或其他破折号(可能是不同的字符)。