#php #string #preg-replace
#php #строка #preg-replace
Вопрос:
Я хотел бы преобразовать эту строку
$text = "TEST#%_'JanE,.-_doc30)/||.pdf$@!3)";
в чистую строку, подобную этой
TEST_JanE_doc30.pdf
Итак, в основном preg_replace должен быть:
- измените все не буквы и цифры перед расширением на один символ подчеркивания (_) в качестве разделителя
- удалите все, что находится после расширения
- сохраните расширение файла (в данном случае .pdf, но это может быть что угодно другое)
Возможно ли это? Это мой текущий preg_replace:
$text = "TEST#%_'JanE,.-_doc30)/||.pdf$@!3)";
$text_filter_1 = preg_replace('/[^.dw.] /', '_', $text);
$text_filter_2 = preg_replace('/./', '_', $text_filter_1);
Комментарии:
1. Откуда вы знаете, что
3
не является допустимой частью расширения файла?2. думаю, mp3-файлов нет
3. @Назовите ее после расширения
4. @tim Я открыт для любых предложений 🙂
5. @Shota оба ответа будут работать с расширениями mp3 (или аналогичными).
Ответ №1:
Вот рабочий скрипт, который использует несколько замен регулярных выражений для выполнения работы. Наиболее важной логикой является разделение начального регулярного выражения по следующему шаблону:
(?=.w )(?!.*..*.)
Здесь говорится о разделении на самую последнюю точку, которая, как предполагается, является расширением файла. Это оставляет нас со следующими двумя компонентами:
Array
(
[0] => TEST#%_'JanE,.-_doc30)/||
[1] => .pdf$@!3)
)
Оставшаяся часть скрипта обрабатывает имя файла, заменяя все группы символов, отличных от word, одним заполнителем подчеркивания. Затем другое регулярное выражение извлекает расширение файла, удаляя все после .pdf
.
$text = "TEST#%_'JanE,.-_doc30)/||.pdf$@!3)";
$parts = preg_split ("/(?=.w )(?!.*..*.)/", $text);
$filename = preg_replace('/[^A-Za-z0-9] /', '_', $parts[0]);
$filename = preg_replace('/_$/', '', $filename);
$ext = preg_replace('/^(.[A-Za-z0-9] ).*$/', '$1', $parts[1]);
print_r($parts);
$file = $filename . $ext;
echo $file;
TEST_JanE_doc30.pdf
Ответ №2:
Вы можете сделать это с помощью трехэтапной замены. Обратите внимание, я предположил, что расширением файла являются буквенно-цифровые символы сразу после последней точки, любые другие (такие как 3
в ваших тестовых данных) отбрасываются.
$text = "TEST#%_'JanE,.-_doc30)/||.pdf$@!3)";
$text = preg_replace(array('/[^dA-Za-z] (?=.*.[^.] $)/',
'/_./',
'/(.[dA-Za-z] ).*$/'),
array('_',
'.',
'$1'),
$text);
echo $text;
Первое регулярное выражение заменяет любую последовательность не алфавитно-цифровых символов перед конечной точкой (определяемой с помощью положительного предвидения (?=.*.[^.] $)
) на единицу _
; второе заменяет _.
последовательность (если она существует после первой замены) на .
, а последнее удаляет все символы после расширения файла.
Вывод:
TEST_JanE_doc30.pdf