2017-02-13 66 views
1

我有以下要求。如何在輸出字符串中保留連字符preg_replace

輸入 ----------:z-edu-l1-^threat -emergency mk pl.jpg

要求 ----:z-edu-l1-_threat_-emergency_mk_pl.jpg

我用以下

$input = 'z-edu-l1-^threat -emergency mk pl.jpg'; 

echo strtolower(preg_replace('/\W(?![^.-]*$)/', '_', trim($input))); 

我獲得以下輸出

z_edu_l1__threat__emergency_mk_pl.jpg 

我不想用下劃線替換 - 符號。如何使用preg_replace在輸出字符串中保留連字符?

+0

應該特殊字符也被刪除? – RomanPerekhrest

+0

@RomanPerekhrest是,也應刪除特殊字符。 – Muk

回答

3

您可以用它的否定字符等價類​​更換\W和否定你需要保留的符號:

[^\w.-] 

regex demo

[^\w.-]匹配任何字符不是一個字母/數字,_.-

PHP demo

$input = 'z-edu-l1-^threat -emergency mk pl.jpg'; 
echo strtolower(preg_replace('/[^\w.-]/', '_', trim($input))); 
// => z-edu-l1-_threat_-emergency_mk_pl.jpg 
1
$input = "z-edu-l1-^threat -emergency mk pl.jpg"; 
$output = str_replace(["^", " "], "_", $input); 
echo $output; 
//output 
//z-edu-l1-_threat_-emergency_mk_pl.jpg 
+0

儘管這段代碼片段是受歡迎的,並且可能會提供一些幫助,但如果它包含* how *和* why *的解釋](// meta.stackexchange.com/q/114762)問題。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –

1

[^東西]會找到一個匹配除了{}東西 \ W - >字母 [^ \ w.-]會發現任何東西,除了α,句號和連字符,並用下劃線替換。

$input = 'z-edu-l1-^threat -emergency mk pl.jpg'; 

echo strtolower(preg_replace('([^\w.-])', '_', trim($input))); 

看到現場demo here

+0

感謝您的回答 - 對正則表達式的解釋,以及它如何解決OP的問題將有所幫助 – Tom

+0

與@WiktorStribiżew的回答有何不同? – Toto

+0

@Toto我沒有看到他的答案。當我選擇在phpfiddle上回答和測試時,沒有收到答案。發佈後,我看到了答案。 –