Я надеюсь на помощь в написании чистого регулярного выражения в 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';
замещать
(?:http:\/\/domain.com)(\S*?\.(?:png|jpg|gif|js|css))\b
с
http://cdndomain.com\1
Идея состоит в том, чтобы соответствовать вашему домену, за которым следуют несколько символов, а затем одно из расширений. Замените это новым доменом и остатком строки, захваченной в группе 1.
Здесь следует отметить три важные вещи:
\S*
(несколько непробельных символов) используется для сопоставления остальной части этого URL. Важно не использовать .*
или же ["']*
или что-то в этом роде, как если бы вы получили совпадение при сбое, а позже появится еще один файл с таким расширением, в который будет включена промежуточная строка.?
так что мы также не попадаем между матчами.\b
) в конце, так что слово, которое просто имеет символы js
в нем (например) не будет заканчиваться совпадение, и это фактическое расширение.$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.