.
(some js and css)
(content that i didn't want to remove)
Источник
в PHP, как удалить определенный класс из тега html?
Я просто хочу либо удалить, либо удалить любой класс, в котором есть «test2», поэтому результат будет следующим:
Я рад использовать выражение регулярного выражения или что-то вроде PHP Simple HTML DOM Parser, но я понятия не имею, как его использовать. И с регулярным выражением, я знаю, как найти элемент, но не конкретный связанный с ним атрибут, особенно если есть несколько атрибутов, подобных моему примеру выше. Есть идеи?
$notest2 = preg_replace( "/class\s*=\s*'[^\']*test2[^\']*'/", "class=''", $src);
используя PHP Simple HTML DOM Parser
Обновлено и проверено! Вы можете включить simple_html_dom.php из приведенной выше ссылки или здесь .
include('../simple_html_dom.php'); $html = str_get_html("");
foreach($html->find('span[class*="test2"]') as $e) $e->class = ''; echo $html;
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
Источник
CSS классы в классе Tag
Как вы видите, атрибут class содержит в себе несколько значений, разделенных пробелами. Эти значения представляют собой несколько CSS классов нашего элемента.
Давайте реализуем в нашем классе Tag набор методов, которые будут работать с этими CSS классами. Например, было бы удобно иметь метод addClass , добавляющий еще один класс в строку с классами.
При этом наш метод должен проверять то, что добавляемый класс еще не присутствует среди классов элемента, иначе добавление нового класса будет приводить к тому, что у элемента будет несколько одинаковых классов, что, конечно же, неправильно.
Пример использования желаемого нами метода:
Было бы также удобно иметь метод removeClass для удаления заданного класса элемента.
Практическое применение этих методов вы еще увидите в следующих уроках.
Давайте реализуем описанные методы.
Добавление класса
Как вы знаете, наш класс Tag хранит атрибуты тега в свойстве $this->attrs . Данное свойство представляет собой массив. В этом массиве может быть элемент с ключом class , содержащий CSS классы элемента. Элемента с таким ключом может, однако, и не быть.
Все зависит от того, был ли при создании тега вызван метод setAttr для установки атрибута class или нет.
Вот пример того, когда он был вызван:
А вот пример того, когда он не был вызван:
В реализации нашего метода addClass нужно будет учесть оба варианта.
Получается, что если у элемента не заданы CSS классы, то вызов метода addClass должен просто создавать в массиве $this->attrs новый элемент с ключом class и записывать в него переданный класс:
attrs: if (!isset($this->attrs[‘class’])) < $this->attrs[‘class’] = $className; // запишем наш CSS класс > return $this; // возвращаем $this для работы цепочки > ?>?php>
Обратите внимание на то, что параметр метода называется $className , а не $class , так как слово class является зарезервированным в PHP и его нельзя использовать в качестве имени переменной.
Давайте теперь рассмотрим второй вариант, когда в $this->attrs[‘class’] уже есть один или несколько классов. Как уже упоминалось выше, эти классы были добавлены ранее с помощью метода setAttr . Эти классы также могли быть добавлены с помощью вызова метода (или цепочки методов) addClass .
Способ добавления, в общем-то, не имеет никакого значения, главное, что, если классы есть, то они хранятся в виде строки, разделенные пробелами. Либо, если там один класс, то в $this->attrs[‘class’] просто хранится его имя, без пробелов.
Пусть в $this->attrs[‘class’] хранится несколько классов. В этом случае будет удобнее работать не со строкой с пробелами, а с массивом CSS классов. Для этого можно просто разбить нашу строку в массив с помощью функции explode :
Затем необходимо проверить отсутствие переданного класса в этом массиве классов. Это легко сделать с помощью функции in_array :
Если переданного класса нет в массиве классов, то добавим его к уже существующим классам. А если есть — то просто ничего не будем делать.
Давайте реализуем добавление класса:
Рассмотрим теперь вариант, когда в $this->attrs[‘class’] хранится только один класс. На самом деле, реализованный выше код будет прекрасно работать и в этом случае: применение explode к строке без пробела просто вернет массив из одного элемента, представляющего собой эту строку. Ну и далее все наши манипуляции будут работать также.
Давайте соберем весь наш код вместе:
Самостоятельно реализуйте описанный метод и добавьте его в ваш класс Tag . Проверьте работу созданного метода, используя приведенные ниже примеры:
: echo (new Tag(‘input’)) ->setAttr(‘class’, ‘eee bbb’) ->addClass(‘eee’) // такой класс уже есть и не добавится ->open(); ?>?php>
: echo (new Tag(‘input’)) ->addClass(‘eee’) ->addClass(‘bbb’) ->addClass(‘eee’) // такой класс уже есть и не добавится ->open(); ?>?php>
Удаление класса
Давайте теперь реализуем удаление CSS класса. Для этого было бы удобно иметь вспомогательный метод, который будет удалять элемент из массива по тексту этого элемента. В PHP, к сожалению, нет такой встроенной функции, поэтому реализуем ее в виде приватного метода:
Используя метод removeElem мы теперь можем реализовать метод removeClass для удаления CSS классов. Реализуем:
Самостоятельно реализуйте описанный метод и добавьте его в ваш класс Tag . Проверьте его работу, например, так:
setAttr(‘class’, ‘eee zzz kkk’) // добавим 3 класса ->removeClass(‘zzz’) // удалим класс ‘zzz’ ->open(); // выведет ?>?php>
Источник
Удалить class и id из css-файла
Задача такая: найти все классы (class) и индетификаторы (id) в css-Ффайле и проверить каждый, есть ли он в указанном html файле.
Если в html файле его нет, то корретно удалить из css-файла.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
function serachClass ($id_class) GLOBAL $css; //Находим все классы $sclid = "/\\" . $id_class . "[\w_-]+(\, //Выделяем уникальные значения из массива $rezult_css = array_unique($rezult_css); //Делаем конечный массив foreach ($rezult_css as $key_val) { $rezult_css_go[] = trim(str_replace($id_class, "", $key_val)); } //Проверка существования класса(ID) в html-файле $serch = file_get_contents("./rezult/default/result.tpl"); for($i_serach = 0; $i_serach count($rezult_css_go); $i_serach++) { if($id_class == ".") { if(preg_match("/class=\".*$rezult_css_go[$i_serach].*\"/", $serch)) { echo "Класс " . $rezult_css_go[$i_serach] . " найден в базе
" ; } else { $bvcbvc = "/[^\>]*?\\" . $id_class . $rezult_css_go[$i_serach] . "[^>]+\>/is"; $css = preg_replace($bvcbvc,'', $css); } } elseif($id_class == "#") { if(preg_match("/id=\".*$rezult_css_go[$i_serach].*\"/", $serch)) { echo "ID " . $rezult_css_go[$i_serach] . " найден в базе
" ; } else { $bvcbvc = "/[^\>]*?\\" . $id_class . $rezult_css_go[$i_serach] . "[^>]+\>/is"; $css = preg_replace($bvcbvc,'', $css); } } } } serachClass("."); serachClass("#");
Классы и ID определяются верно.
Проблема в регулярке, которая удаляет в css-файле не найденные в html-коде классы и ID. Т.е. вот в этой:
$bvcbvc = "/[^\>]*?\\" . $id_class . $rezult_css_go[$i_serach] . "[^>]+\>/is"; $css = preg_replace($bvcbvc,'', $css);
Почему-то удаляется часть элементов, которые были найдены в html-файле.
К сожалению, не смог отследить закономерность.
Не могу понять, в чем моя ошибка?
Источник
Регулярные выражения для удаления тегов
Подборка регулярных выражений для удаления HTML тегов и атрибутов.
Удаление тегов
$text = 'Текст текст
'; echo preg_replace('/\s?Читайте также: font-family