2016-03-28 75 views
3

我需要替換一個字符串中不是一個字,空格,逗號,句號,問號,感嘆號,星號或'的所有內容。我試圖做使用了preg_replace,但沒有得到正確的結果:使用preg_replace不能正常工作

$string = "i don't know if i can do this,.?!*[email protected]#$%^&()_+123|"; 
preg_replace("~(?![\w\s]+|[\,\.\?\!\*]+|'|)~", "", $string); 

echo $string; 

結果:?

我不知道如果我能做到這一點,!! * @# $%^ &()_ + 123 |

需要結果:

我不知道如果我能做到這一點,*

回答

1

我不知道你是否樂意叫html_entity_decode先來轉換'?!成撇號。如果你是,那麼很可能實現這一目標的最簡單方法是

// Convert HTML entities to characters 
$string = html_entity_decode($string, ENT_QUOTES); 
// Remove characters other than the specified list. 
$string = preg_replace("~[^\w\s,.?!*']+~", "", $string); 
// Convert characters back to HTML entities. This will convert the ' back to ' 
$string = htmlspecialchars($string, ENT_QUOTES); 

如果沒有,那麼你就需要使用一些負面assertions刪除&後面沒有#;當不受&#039前面時,和等等。

$string = preg_replace("~[^\w\s,.?!*'&#;]+|&(?!#)|&#(?!039;)|(?<!&)#|(?<!&#039);~", "", $string); 

結果微妙不同。第一個代碼塊在提供&quot;時,會將其轉換爲",然後將其從字符串中刪除。第二個區塊將刪除&;,並在結果中留下quot

+0

第一種選擇是更好,更整潔。 – frosty