2015-12-26 3 views
1

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

Например:

$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 .gif .jpg .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 

See it in action


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

+0

спасибо! и спасибо за объяснение! – user1678033