Запись изменений обратно в объект запроса Zend Dom - PullRequest
5 голосов
/ 06 мая 2011

Я хочу просмотреть изображения в HTML-документе и задать ширину / высоту, если они не существуют.

Вот минимальный фрагмент рабочего кода:

$content = '<img src="example.gif" />';
$dom = new Zend_Dom_Query($content);
$imgs = $dom->query('img');
foreach ($imgs as $img) {
    $width = (int) $img->getAttribute('width');
    $height = (int) $img->getAttribute('height');
    if ((0 == $width) && (0 == $height)) {
        $img->setAttribute('width', 100));
        $img->setAttribute('height', 100);
    }
}
$content = $dom->getDocument();

Вызовы setAttribute() устанавливают значения, и я подтвердил это, повторив значения. Проблема в том, что DOMElement не записывается обратно в объект Zend_Dom_Query. Переменная $content в конце не изменяется.


РЕШЕНИЕ : cbuckley получает кредит, но вот мой последний рабочий код:

$doc = new DOMDocument();
$doc->loadHTML($content);
foreach ($doc->getElementsByTagName('img') as $img) {
    if ((list($width, $height) = getimagesize($img->getAttribute('src')))
            && (0 === (int) $img->getAttribute('width'))
            && (0 === (int) $img->getAttribute('height'))) {
        $img->setAttribute('width', $width);
        $img->setAttribute('height', $height);
    }
}
$content = $doc->saveHTML();

Делаем это с Zend_Dom_Query:

$dom = new Zend_Dom_Query($content);
$imgs = $dom->query('img');
foreach ($imgs as $img) {
    if ((list($width, $height) = getimagesize($img->getAttribute('src')))
            && (0 === (int) $img->getAttribute('width'))
            && (0 === (int) $img->getAttribute('height'))) {
        $img->setAttribute('width', $width);
        $img->setAttribute('height', $height);
    }
}
$content = $imgs->getDocument()->saveHTML();

1 Ответ

3 голосов
/ 07 мая 2011

Объект Zend_Dom_Query содержит вашу строку содержимого в качестве своего «документа».Документ, который вы ищете, находится в другом объекте;он возвращается в объекте Zend_Dom_Query_Result $imgs, поэтому используйте вместо него $imgs->getDocument().

Вы также можете сделать это с прямой манипуляцией DOM:

$doc = new DOMDocument();
$doc->loadXml($content);

foreach ($doc->getElementsByTagName('img') as $img) {
    $width  = (int) $img->getAttribute('width');
    $height = (int) $img->getAttribute('height');

    if (0 === $width && 0 === $height) {
        $img->setAttribute('width',  '100');
        $img->setAttribute('height', '100');
    }
}

$content = $doc->saveXML();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...