2016-10-17 16 views
1

preg_replace在我從數據庫中獲取的字符串上使用它時不會返回所需的結果。PHP正則表達式不能與數據庫中的字符串一起使用

$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"); 

缺少什麼我在這裏?

+0

如果您使用'/ \ p {Pd} /''模式,您是否匹配連字符/短劃線? –

+0

不,仍然打印相同的字符串 – Palo

+0

然後,字符串中可能沒有'-'。不知道它是否有幫助,也可以添加'/ u'修飾符,'/ \ p {Pd}/u'。 –

回答

1

事實證明,您的字符串中包含Unicode破折號。要匹配所有Unicode破折號,使用

/\p{Pd}/u 

regex demo

\p{Pd}比賽中Unicode Character Category 'Punctuation, Dash'任何連字符。

/u修飾符使模式識別Unicode,並使正則表達式引擎將輸入字符串視爲Unicode碼點序列,而不是字節序列。

相關問題