Вопрос по php, preg-replace, regex – Регулярное выражение для изменения <img> относительные URL к абсолютным

3

Мне нужно заглянуть внутрь строки HTML и изменить все<img> теги, гдеsrc Атрибут является относительным адресом, к абсолютному URL. Итак, это:

<code><img src="puppies.jpg">
</code>

должен стать:

<code><img src="http://sitename.com/path/puppies.jpg">
</code>

игнорируя<img> теги которыхsrc атрибут уже абсолютный.

Я использую PHP и предполагаю, что мне нужно выполнить это черезpreg_replace(), Помогите! И спасибо!

Это для JavaScript, но принцип тот же. Madara Uchiha♦
Попробуйте использовать класс DomDocument вместо preg для выполнения HTML-вещей. Ja͢ck
возможный дубликатJavascript: REGEX to change all relative Urls to Absolute Madara Uchiha♦

Ваш Ответ

2   ответа
7

not работа для регулярного выражения. работа парсера XML / DOM.

Я бы дал DOMDocument шанс.

$DOM = new DOMDocument;
$DOM->loadHTML($html);

$imgs = $DOM->getElementsByTagName('img');
foreach($imgs as $img){
    $src = $img->getAttribute('src');
    if(strpos($src, 'http://sitename.com/path/') !== 0){
        $img->setAttribute('src', "http://sitename.com/path/$src");
    }
}

$html = $DOM->saveHTML();
@Jack: Хорошая идея, изменилась :-P
Я проголосовал, но это также нуждается в проверкеsrc атрибуты, которые уже являются абсолютными, согласно ОП.
@Mathletics: Ах да, не заметил, я могу добавить, что :-P
+1, хотя я бы использовал getElementsByTagName вместо xpath
Ура! Это делает это! Вопрос: возвращаемый HTML-код автоматически получает теги & lt; doctype & gt ;, & lt; html & gt ;, & lt; body & gt ;, etc .... Есть ли способ отключить это? Все, что я хочу, - это то, что я дал, чтобы начать ... просто с выполненной части поиска и замены. Имеет ли это смысл? Sam
0

s a job for an XML/DOM parser.

Нет, это не так. Если вы просто хотите добавить префикс к каждому атрибуту src, лучше всего использовать простые строковые функции и даже не думать о разборе xml, regex или dom & # x2026;

$str = str_replace('<img src="', '<img src="http://prefix', $str);

Вы можете убрать неправильные ссылки (уже абсолютные) впоследствии

$str = str_replace('<img src="http://prefixhttp://', '<img src="http://', $str);

Не взрывайте свой код с помощью regexp / dom, если вы можете избежать этого.

неправильные ссылки могут быть легко исправлены:str_replace('prefixprefix', 'prefix', $str) str_replace('http://prefix/http://', 'http://', $str)  не взрывайте свой код с помощью regex / dom, если вам не нужно & # x2026;
Что произойдет, если мой HTML был<img class='animals' src='puppies.jpg' />?
@ semu, я полностью с тобой в этом. Заthis у экземпляра (и у меня) нет причин добавлять все виды ненужных накладных расходов, когда существует простое решение ... хотя и не самое изящное, оно определенно выполняет свою работу. Sam
@Rocket извините, но он сказал, что его HTML<img src="puppies.jpg">
Где в этом коде вы будете проверять относительные URL?

Похожие вопросы