Как получить чистую строку с расширением preg_replace в php? - PullRequest
1 голос
/ 21 марта 2019

Я хотел бы преобразовать эту строку

$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('/[^.\d\w\.]+/', '_', $text);
$text_filter_2 = preg_replace('/\./', '_', $text_filter_1);

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Вы можете сделать это с 3-х этапной заменой. Примечание. Я предположил, что расширение файла представляет собой буквенно-цифровые символы сразу после последнего периода, любые другие (например, 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

1 голос
/ 21 марта 2019

Вот рабочий скрипт, который использует несколько замен регулярных выражений для выполнения работы.Наиболее важной логикой является начальное разделение регулярных выражений по следующему шаблону:

(?=\.\w+)(?!.*\..*\.)

Это говорит о разделении по самой последней точке, которая считается расширением файла.Это оставляет нам два следующих компонента:

Array
(
    [0] => TEST#%_'JanE,.-_doc30)/||\
    [1] => .pdf$@!3)
)

Остальная часть скрипта обрабатывает имя файла, заменяя все группы несловных символов одним заполнителем подчеркивания.Затем другое регулярное выражение извлекает расширение файла, удаляя все после .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
...