в PHP, как удалить определенный класс из тега html?

учитывая следующую строку в PHP:

$html = "<div> <p><span class='test1 test2 test3'>text 1</span></p> <p><span class='test1 test2'>text 2</span></p> <p><span class='test1'>text 3</span></p> <p><span class='test1 test3 test2'>text 4</span></p> </div>"; 

Я просто хочу либо удалить, либо удалить любой класс, в котором есть «test2», поэтому результат будет следующим:

 <div> <p><span class=''>text 1</span></p> <p><span class=''>text 2</span></p> <p><span class='test1'>text 3</span></p> <p><span class=''>text 4</span></p> </div> 

если вы удаляете элемент:

 <div> <p>text 1</p> <p>text 2</p> <p><span class='test1'>text 3</span></p> <p>text 4</p> </div> 

Я рад использовать выражение регулярного выражения или что-то вроде PHP Simple HTML DOM Parser, но я понятия не имею, как его использовать. И с регулярным выражением, я знаю, как найти элемент, но не конкретный связанный с ним атрибут, особенно если есть несколько атрибутов, подобных моему примеру выше. Есть идеи?

 $notest2 = preg_replace( "/class\s*=\s*'[^\']*test2[^\']*'/", "class=''", $src); 

C.

используя PHP Simple HTML DOM Parser

Обновлено и проверено! Вы можете включить simple_html_dom.php из приведенной выше ссылки или здесь .

для обоих случаев:

 include('../simple_html_dom.php'); $html = str_get_html("<div><p><span class='test1 test2 test3'>text 1</span></p> <p><span class='test1 test2'>text 2</span></p> <p><span class='test1'>text 3</span></p> <p><span class='test1 test3 test2'>text 4</span></p></div>"); 

Дело 1:

 foreach($html->find('span[class*="test2"]') as $e) $e->class = ''; echo $html; 

случай 2:

 foreach($html->find('span[class*="test2"]') as $e) $e->parent()->innertext = $e->plaintext; echo $html; 

Класс DOMDocument – это очень простой и понятный интерфейс, который поможет вам работать с вашими данными в стиле DOM. Запрос вашей DOM с помощью селекторов xpath должен быть задачей (-ами) тем более тривиальным:

Очистить все классы

 // Build our DOMDocument, and load our HTML $doc = new DOMDocument(); $doc->loadHTML($html); // Preserve a reference to our DIV container $div = $doc->getElementsByTagName("div")->item(0); // New-up an instance of our DOMXPath class $xpath = new DOMXPath($doc); // Find all elements whose class attribute has test2 $elements = $xpath->query("//*[contains(@class,'test2')]"); // Cycle over each, remove attribute 'class' foreach ($elements as $element) { // Empty out the class attribute value $element->attributes->getNamedItem("class")->nodeValue = ''; // Or remove the attribute entirely // $element->removeAttribute("class"); } // Output the HTML of our container echo $doc->saveHTML($div); 

Вы можете использовать любой DOM Parser, перебирать каждый элемент. Проверьте, содержит ли его атрибут class test2 class ( strpos () ), если это так, тогда установите пустую строку как значение для атрибута class .

Вы также можете использовать регулярные выражения для этого – гораздо более короткий путь. Просто найдите и замените ( preg_replace () ), используя следующее выражение: #class=".*?test2.*?"#is