в PHP, как удалить определенный класс из тега HTML? - PullRequest
3 голосов
/ 21 января 2010

с учетом следующей строки в 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, но я понятия не имею, как его использовать. И с помощью регулярных выражений я знаю, как найти элемент, но не конкретный атрибут, связанный с ним, особенно если есть несколько атрибутов, как в моем примере выше. Есть идеи?

Ответы [ 4 ]

6 голосов
/ 25 ноября 2012

Класс 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);
4 голосов
/ 21 января 2010

с использованием 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;
3 голосов
/ 21 января 2010
$notest2 = preg_replace(
         "/class\s*=\s*'[^\']*test2[^\']*'/", 
         "class=''", 
         $src);

С

1 голос
/ 21 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...