Найдите все возможные ссылки на файлы в строке и установите кнопку загрузки со ссылкой на них внутри

#php #regex #file #preg-replace #preg-match

#php #регулярное выражение #файл #preg-replace #preg-match

Вопрос:

Я хочу изменить приведенный ниже код, чтобы получить все возможные файлы со всеми возможными расширениями, а не только exe , zip , rar , bin и т.д.

 $find=array('~(<a(.*)href="([^"]*.exe)"(.*)>)([^<]*)(</a>)~',
'~(<a(.*)href="([^"]*.zip)"(.*)>)([^<]*)(</a>)~',
'~(<a(.*)href="([^"]*.rar)"(.*)>)([^<]*)(</a>)~',
'~(<a(.*)href="([^"]*.bin)"(.*)>)([^<]*)(</a>)~');

$matches[$i][1] = preg_replace($find, '<p>$0</p><a href=$3 class="btn btn-success" download>Download</a>',$matches[$i][1]);
  

Комментарии:

1. нет, я этого не делаю, но я хочу получить все возможные перестановки расширений в одном коде @fronthem

2. Возможно, вам просто нужно было (<a(.*)href="([^"]*.(?:exe|zip|rar|bin))"(.*)>)([^<]*)(</a>) начать. Если вы копируете / вставляете один и тот же код несколько раз, вам следует просмотреть его во второй раз. Согласно вашему комментарию ниже, что вы хотите расширение между 2-4 символами, которое вы могли бы сделать (<a(.*)href="([^"]*..{2,4})"(.*)>)([^<]*)(</a>‌​) ; или вы могли бы поменять . на символьный класс, разрешающий только буквенно-цифровые символы. Возможно, вы захотите посмотреть, какие символы разрешены в качестве расширений для используемой вами ОС.

3. теперь я чувствую себя так глупо, спасибо @chris85

Ответ №1:

Теоретически существует почти бесконечное количество файлов и расширений, если вы хотите захватить их все, замените

 *.exe 
  

с помощью

 *.* 
  

и это должно охватить все

Комментарии:

1. Можете ли вы привести более полный пример в своем вступительном сообщении? Это действительно должно сработать для вас, поскольку * является шаблоном. Мне интересно посмотреть ваш пример, можете ли вы опубликовать его на ideone?

2. я хочу получить расширение файла до 2-4 мест после (.)

3. .* что угодно (кроме новых строк).

4. это становится / слишком, и я этого не хочу. @chris85

Ответ №2:

Я мог бы привести вам несколько простых примеров, которые вы можете применить к своей работе

 <a href="(?:./)?(?:[^/"] /)*[^/"]*.([a-zA-Z] )">
  

Это регулярное выражение попытается захватить расширение файла в <a ...> теге open.

Объяснение

(?:./)? сопоставьте префикс ./ пути к файлу, если он существует,

(?:[^/"] /)* сопоставьте любые возможные пути, которые заканчиваются, / например this/is/my/path/ ,

[^/"]* сопоставьте имя файла,

. сопоставьте точку,

([a-zA-Z] ) сопоставьте расширение файла.

Смотрите ДЕМОНСТРАЦИЮ

Комментарии:

1. Не работает должным образом, можете ли вы реализовать код в моем примере?

2. Что вы хотите сделать? сопоставьте или захватите какую часть <a..> тега.

3. это не так, это единственное, что работает. Вы можете попробовать, ваш не работает

4. <a href="part i wanna have containg link filename extension ">FileName</a>

5. regex101.com/r/UPyMx3/2 это еще одна версия, поддерживающая несколько атрибутов.