Как получить чистую строку с расширением с помощью preg_replace в php?

#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
  

Демонстрация на 3v4l.org