Jak usunąć obrazy za pomocą DOMDocument
Pisałem o DOMDocument w kilku innych postach (1, 2, 3, aby podzielić się kilkoma), ale nadal uważam go za przydatny na różne sposoby.
Pamiętaj, DOMDocument to klasa w PHP, która pozwala nam manipulować dokumentem HTML przed wyrenderowaniem go w przeglądarce.
Reprezentuje cały dokument HTML lub XML; służy jako korzeń drzewa dokumentu.
Ilekroć myślę o pracy z saveHTMLfunkcją, myślę o potrzebie serializacji nowych informacji do pliku lub innego strumienia wyjściowego przed wysłaniem go do przeglądarki.
Ale nie musimy tego robić. Można to zrobić w pamięci.
Przykład: w projekcie muszę znaleźć wszystkie elementy obrazu w dokumencie. Jeśli obraz nie ma prawidłowego źródłowego adresu URL, muszę albo zastąpić atrybut źródła, albo go usunąć.
Na potrzeby tego przykładu załóżmy, że:
isValidImagejest funkcją, która jest odpowiedzialna za sprawdzenie, czy określony atrybut źródłowy jest tłumaczony na poprawny adres URL,- Że ustawiam
srcatrybut na pusty ciąg, a nie obraz zastępczy, aby zachować prosty kod, - I zwracam wynik do tego, co zostanie wyrenderowane w szablonie lub części.
Skomentowałem kod, więc powinien być dość łatwy do naśladowania dla tego przykładu:
<?php
// Instantiate a DOMDocument object and load the incoming $description HTML.
$domDocument = new DOMDocument();
$domContent = $domDocument->loadHTML(mb_convert_encoding($description, 'HTML-ENTITIES'));
// Find all of the images in the HTML.
$images = $domDocument->getElementsByTagName('img');
// If there are images, then iterate through each of them.
if (0 !== count($images)) {
$urlPrefix = $this->getUrlPrefix(); // A helper function for getting the URL prefix.
foreach ($images as $image) {
$image->setAttribute(
'src',
$urlPrefix.$image->getAttribute('src')
);
// If the image's source results in a 404 status code, set the `src` to an empty string.
if (!$this->isValidImage($image->getAttribute('src'))) {
$image->setAttribute('src', '');
}
}
}
// Save the changed document and send it to the front-end.
return $domDocument->saveHTML();
Zwróć uwagę, że powyższy kod można ulepszyć na kilka sposobów (np. wczesny powrót, jeśli nie zostaną znalezione żadne obrazy), ale celem jest pokazanie, jak zastąpić srcatrybut, jeśli adres URL nie zostanie poprawnie rozwiązany. W ten sposób usuwam obrazy za pomocą DOMDocument.
Jeśli interesuje Cię, jak ustalić, czy adres URL jest prawidłowy, ten artykuł może być pomocny.
