Регулярное выражение изменения домена по типу файла для интеграции cdn

Я надеюсь на помощь в написании чистого регулярного выражения в PHP для преобразования домена определенных видов ресурсов из строки, потенциально содержащей URL-адреса нескольких ресурсов (изображения, javascripts и т. Д.)

Например:

$string = 'Some content including image tags <img src="http://domain.com/image.png" /> and image urls http://domain.com/image.png and javascript links <script src="http://domain.com/funtimes.js"></script> and js urls http://domain.com/funtimes.js but not this image http://notthisdomain.com/nope.png';

Регулярное выражение должно изменить домен для активов в http://domain.com в http://cdndomain.com, но только для файлов с расширениями: .png .jpg .gif .js .css

Желаемый результат для вышеупомянутого будет

$string = 'Some content including image tags <img src="http://cdndomain.com/image.png" /> and image urls http://cdndomain.com/image.png and javascript links <script src="http://cdndomain.com/funtimes.js"></script> and js urls http://cdndomain.com/funtimes.js but not this image http://notthisdomain.com/nope.png';

1

Решение

замещать

(?:http:\/\/domain.com)(\S*?\.(?:png|jpg|gif|js|css))\b

с

http://cdndomain.com\1

Увидеть это в действии


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


Здесь следует отметить три важные вещи:

  • \S* (несколько непробельных символов) используется для сопоставления остальной части этого URL. Важно не использовать .* или же ["']* или что-то в этом роде, как если бы вы получили совпадение при сбое, а позже появится еще один файл с таким расширением, в который будет включена промежуточная строка.
  • Это ленивый с ? так что мы также не попадаем между матчами.
  • Есть граница слова (\b) в конце, так что слово, которое просто имеет символы js в нем (например) не будет заканчиваться совпадение, и это фактическое расширение.
1

Другие решения

$string = 'Some content including image tags <img src="http://domain.com/image.png" /> and image urls http://domain.com/image.png and javascript links <script src="http://domain.com/funtimes.js"></script> and js urls http://domain.com/funtimes.js but not this image http://notthisdomain.com/nope.png';
$file_types = "png|js|jpeg|jpg";

echo preg_replace ( "/http:\/\/domain.com([^\"']*($file_types))[\"']/" , "http://cdn.domain.com$1" , $string);

# output:
# Some content including image tags <img src="http://cdn.domain.com/image.png" /> and image urls http://cdn.domain.com/image.png and javascript links <script src="http://cdn.domain.com/funtimes.js"></script> and js urls http://cdn.domain.com/funtimes.js but not this image http://notthisdomain.com/nope.png

Как это работает, это начинается с сопоставления http://domain.com. Затем он продолжает поиск, пока не найдет один из ваших определенных $file_types расширения, за которыми сразу следует двойная или одинарная кавычка ([\"']).

Если в любое время во время поиска расширения оно сначала попадает в одинарную или двойную кавычку ([^\"']), мы можем сделать вывод, что у этого URL, который мы сейчас просматриваем, нет нужного нам расширения, поэтому мы перезапускаем поиск по следующему URL.

1