Удалите теги, но сохраните первый

Как я могу сохранить, например, первый тег img, но удалить все остальные?

(из строки HTML)

пример:

<p>
 some text 
 <img src="aimage.jpg" alt="desc" width="320" height="200" /> 
 <img src="aimagethatneedstoberemoved.jpg" ... />
</p>

так должно быть просто:

<p>
 some text 
 <img src="aimage.jpg" alt="desc" width="320" height="200" /> 
</p>

person Anda    schedule 17.09.2011    source источник
comment
Пример строки, пожалуйста, и ваша попытка.   -  person Michael Petrotta    schedule 18.09.2011
comment
Кроме того, синтаксический анализ HTML с помощью PHP - не очень хорошая идея (хотя, я думаю, мы все делали это в какой-то момент). Если вы можете переопределить проблему, чтобы избежать этого, сделайте это.   -  person Jon    schedule 18.09.2011
comment
но мне нужно как-то сделать это с PHP   -  person Anda    schedule 18.09.2011
comment
Там только один тег img. Я предполагаю, что в любой момент могут появиться дополнительные теги img?   -  person Michael Petrotta    schedule 18.09.2011
comment
Удалить все остальные теги IMG или все остальные теги?   -  person hakre    schedule 18.09.2011
comment
@ Анда: Почему это? Какую проблему ты пытаешься решить?   -  person Lightness Races in Orbit    schedule 18.09.2011
comment
Используйте анализатор HTML: stackoverflow. ком/вопросы/3577641/   -  person Arnaud Le Blanc    schedule 18.09.2011


Ответы (2)


Функцию из этого примера можно использовать для сохранения первых N тегов IMG и удаления всех остальных <img>.

// Function to keep first $nrimg IMG tags in $str, and strip all the other <img>s
// From: http://coursesweb.net/php-mysql/
function keepNrImgs($nrimg, $str) {
  // gets an array with al <img> tags from $str
  if(preg_match_all('/(\<img[^\>]+\>)/i', $str, $mt)) {
    // gets array with the <img>s that must be stripped ($nrimg+), and removes them
    $remove_img = array_slice($mt[1], $nrimg);
    $str = str_ireplace($remove_img, '', $str);
  }
  return $str;
}

// Test, keeps the first two IMG tags in $str
$str = 'First img: <img src="img1.jpg" alt="img 1" width="30" />, second image: <img src="img_2.jpg" alt="img 2" width="30">, another Img tag <img src="img3.jpg" alt="img 3" width="30" />, etc.';
$str = keepNrImgs(2, $str);
echo $str;
/* Output:
 First img: <img src="img1.jpg" alt="img 1" width="30" />, second image: <img src="img_2.jpg" alt="img 2" width="30">, another Img tag , ... etc.
*/
person CoursesWeb    schedule 17.02.2014

Возможно, вы сможете сделать это с помощью сложной строки регулярного выражения, однако я предлагаю использовать preg_replace_callback, особенно если вы используете php 5.3+, и вот почему. http://www.php.net/manual/en/function.preg-replace-callback.php

$tagTracking = array();
preg_replace_callback('/<[^<]+?(>|/>)/', function($match) use($tagTracking) {
    // your code to track tags here, and apply as you desire.
});
person Howard Lince III    schedule 17.09.2011
comment
Это неполный ответ и указывает OP в неправильном направлении. PHP имеет встроенную функциональность синтаксического анализа HTML DOM, а также сторонние инструменты, которые упрощают его использование, и манипулирование DOM является гораздо более подходящим методом для этого. - person Peter Boughton; 18.09.2011
comment
Я уважаю ваше мнение. И хотя в PHP есть функция парсинга DOM, которую вы ему тоже не предоставили, здесь: php.net/manual/en/book.dom.php - это простое решение с точки зрения простоты. Что касается не предоставления полного кода, я не видел необходимости делать весь код, но предоставить фреймворк, чтобы он мог сам понять, как он хочет его использовать. - person Howard Lince III; 18.09.2011
comment
Я не предоставил ссылки, потому что они уже были предоставлены как в качестве комментария к вопросу, так и в качестве ответа на дополнительный вопрос. - person Peter Boughton; 18.09.2011
comment
Предоставление фреймворка в целом хорошо, но вы не объяснили его и не указали, что его следует использовать с осторожностью, и это это такое простое решение, что вы могли бы просто добавить логику сказать, если первое изображение, вернуть совпадающий текст, иначе вернуть пустую строку, потому что это в основном все, что отсутствует (ну, и регулярное выражение обновлено, чтобы обслуживать только теги img) - вот почему я говорю, что это неполный. - person Peter Boughton; 18.09.2011
comment
(p.s. надеюсь, что это не звучит как плаксивость/что-то еще - я намерен быть конструктивным) - person Peter Boughton; 18.09.2011