2017-02-13 8 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] и свести на нет символы, нужно сохранить:

[^\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

Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, было бы [значительно улучшено, если бы оно включало объяснение] (// meta.stackexchange.com/q/114762) из ​​* how * и * why *, это решает проблема. Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

1

[^ что-то] найдет совпадение, за исключением {то} \ ш -> алфавиты [^ \ w.-] будет найти что-нибудь, кроме альфа, периода и дефиса и замените его символом подчеркивания.

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

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

Смотрите живой demo here

+0

Спасибо за ваш ответ - объяснение вашего регулярного выражения и то, как он решает вопрос ОП, было бы полезно – Tom

+0

В чем это отличие от ответа @ WiktorStribiżew? – Toto

+0

@Toto Я не видел его ответа. Хотя я решил отвечать и тестировать его на phpfiddle, ответов не было получено. После публикации только я увидел ответ. –