учитывая следующую строку в 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