PHP & Regex: добавление URL сайта в изображения - PullRequest
1 голос
/ 30 ноября 2009

У меня есть следующий код ниже на моем сайте. Он используется для поиска изображений в блоке HTML, который не имеет http: // или / впереди. В этом случае URL-адрес веб-сайта будет добавлен в начало источника изображения.

Например:

<img src="http://domain.com/image.jpg"> will stay the same
<img src="/image.jpg"> will stay the same
<img src="image.jpg"> will be changed to <img src="http://domain.com/image.jpg">

Я чувствую, что мой код действительно неэффективен ... Есть идеи, как заставить его работать с меньшим количеством кода?

preg_match_all('/<img[\s]+[^>]*src\s*=\s*[\"\']?([^\'\" >]+)[\'\" >]/i', $content_text, $matches);
if (isset($matches[1])) {
  foreach($matches[1] AS $link) {
    if (!preg_match("/^(https?|ftp)\:\/\//sie", $link) && !preg_match("/^\//sie", $link)) {
      $full_link = get_option('siteurl') . '/' . $link;
      $content_text = str_replace($link, $full_link, $content_text);
    }
  }
}

Ответы [ 4 ]

6 голосов
/ 30 ноября 2009

Для начала вы можете перестать использовать регулярные выражения для обработки HTML, особенно когда то, что вы делаете, так легко сделать с помощью анализатора HTML (из которых PHP имеет по крайней мере 3). Например:

$dom = new DomDocoument;
$dom->loadHTML($html);
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
  $src = $image->getAttribute('src');
  $url = parse_url($src);
  $image->setAttribute('src', http_build_url('http://www.example.com', $url);
}
$html = $dom->saveHTML();

Проблема решена. Ну, почти. Случай, когда вы добавляете имя хоста к относительным URL, но не к тем, которые начинаются с /, немного озадачивает и не обрабатывается в этом фрагменте, но это относительно небольшое изменение (оно включает проверку $url['path']).

См. Анализ HTML с PHP и DOM , объектная модель документа , parse_url() и http_build_url(). PHP имеет гораздо лучшие инструменты для этого, чем регулярные выражения.

Да, и для правильной меры прочитайте Разбор HTML Путь Ктулху .

4 голосов
/ 30 ноября 2009

Может быть, совершенно другой подход тоже может сработать:

<base href="http://domain.com/" />

0 голосов
/ 30 ноября 2009

Это не проверено, но я думаю, что-то вроде этого ...

preg_match_all('/<img\b[^>]*\bsrc\s*=\s*[\'"]?([^\'">]*)/i', $content_text, $matches);
0 голосов
/ 30 ноября 2009

Попытка сопоставить HTML с регулярными выражениями очень трудна.

Даже если может показаться, что ваш код работает, есть большая вероятность того, что некоторые теги IMG будут проскальзывать, поскольку они не соответствуют указанному вами формату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...