2017-02-13 85 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上回答和测试时,没有收到答案。发布后,我看到了答案。 –