Мне просто интересно, знает ли кто-нибудь функцию для удаления ВСЕХ классов из строки в php .. В основном я хочу только

<p> 

Теги, а не

<p class="...">

Если в этом есть смысл :)

8
SoulieBaby 23 Июл 2009 в 14:35

6 ответов

Лучший ответ

Довольно наивное регулярное выражение, вероятно, сработает для вас

$html=preg_replace('/class=".*?"/', '', $html);

Я говорю «наивный», потому что он потерпит неудачу, если ваш основной текст по какой-то причине будет содержать class = "something" !. Его можно было бы сделать немного более надежным, если нужно будет искать class = "" внутри тегов, заключенных в угловые скобки.

10
Paul Dixon 23 Июл 2009 в 10:38

Вы загружаете HTML в класс DOMDocument, загружаете его в simpleXML. Затем вы выполняете запрос XPath для всех элементов p и затем просматриваете их. В каждом цикле вы переименовываете атрибут класса во что-то вроде «killmeplease».

Когда это будет сделано, повторно выведите simpleXML как XML (который, кстати, может изменить HTML, но обычно только в лучшую сторону), и у вас будет строка HTML, в которой каждый p имеет класс «killmeplease». Используйте str_replace, чтобы удалить их.

Примере:

$html_file = "somehtmlfile.html";

$dom = new DOMDocument();
$dom->loadHTMLFile($html_file);

$xml = simplexml_import_dom($dom);

$paragraphs = $xml->xpath("//p");

foreach($paragraphs as $paragraph) {
     $paragraph['class'] = "killmeplease";
 }

 $new_html = $xml->asXML();

 $better_html = str_replace('class="killmeplease"', "", $new_html);

Или, если вы хотите сделать код более простым, но запутаться с preg_replace, вы можете пойти с:

$html_file = "somehtmlfile.html";
$html_string = file_get_contents($html_file);

$bad_p_class = "/(<p ).*(class=.*)(\s.*>)/";

$better_html = preg_replace($bad_p_class, '$1 $3', $html_string);

Сложность с регулярными выражениями заключается в том, что они имеют тенденцию быть жадными, и попытка отключить это может вызвать проблемы, если в вашем теге элемента p есть разрыв строки. Но дайте шанс любому из них.

2
Anthony 23 Июл 2009 в 11:09

Очиститель HTML

HTML может быть очень сложным для регулярного выражения из-за сотен различных способов написания или форматирования кода.

Очиститель HTML - это зрелая библиотека с открытым исходным кодом для очистки HTML. Я бы посоветовал его использовать в этом случае.

В документации по настройке очистителя HTML вы можете указать классы и атрибуты, которые должны быть разрешены, и что очиститель должен делать, если обнаружит их.

http://htmlpurifier.org/docs/

2
Jon Winstanley 23 Июл 2009 в 11:13
$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";    
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html);

Если вы проходите тест с использованием HTML, экспортированного из Microsoft Office, вам понадобится нечто большее, чем удаление классов, но HTML Tidy имеет флаг конфигурации только для Microsoft Office!

В противном случае это должно быть безопаснее, чем некоторые другие ответы, поскольку они немного жадны, и вы не знаете, какой тип инкапсуляции будет использоваться (' или ").

Примечание. Шаблон на самом деле /\sclass=['|"][^'"]+['|"]/, но, поскольку оба апострофа в кавычках (") ('), мне пришлось избегать всех вхождений одного (\') для инкапсуляции шаблона.

2
Alastair 11 Окт 2012 в 15:04

Я бы сделал что-то подобное на jQuery. Поместите это в заголовок своей страницы:

$(document).ready(function(){
$(p).each(function(){
     $(this).removeAttr("class");
     //or  $(this).removeclass("className");
})

});

1
Teknotica 23 Июл 2009 в 10:42