2016-04-01 89 views
-1

我需要替換不是單號,單引號,逗號,句號,問號或感嘆號的所有內容。但我的正則表達式似乎並沒有正常工作。我究竟做錯了什麼?替換不是字母,單引號,逗號,句號,問號或感嘆號的所有內容

$userResponse = "i'm so happy that you're here with me! :)"; 
$userResponse = preg_replace("~(?!['\,\.\?\!a-zA-Z]+)~", "", $userResponse); 

echo $userResponse; 

結果:

i'm so happy that you're here with me! :) 

需要結果:

i'm so happy that you're here with me! 

回答

1

讓我們來看看你與(?!['\,\.\?\!a-zA-Z]+)做什麼。

你的正則表達式是什麼意思是如果存在多個在課堂上提到的字符,如果存在,則匹配零寬度後繼續看。

所以你的正則表達式將尋找允許的字符和匹配零寬度,因爲使用的是negative look ahead

Dotted lines in test string is zero width.

試着用以下的正則表達式。

正則表達式:[^a-zA-Z',.?!\s]

說明:此正則表達式匹配什麼除了在課堂上提到的人物和被empty string取代。

PHP代碼:

<?php 
    $userResponse = "i'm so happy that you're here with me! :)"; 
    $userResponse = preg_replace("~[^a-zA-Z',.?!\s]~", "", $userResponse); 
    echo $userResponse; 
?> 

Regex101 Demo

Ideone Demo

2

就試試這個:

[^a-zA-Z',.?! ]+ 
+0

在結尾添加一個加號]會使它更快一點吧? – frosty

+0

是的,你是對的。我會更新它 – JanLeeYu