Хотелось бы удалить любой атрибут в тегах html, и я думаю, что это может быть достигнуто с помощью regex, но я не очень хорошо использую регулярное выражение.
Пробовал работать с str_replace, но это просто не правильный путь. И я искал вопросы, подобные этому, но не смог найти.
Пример:
Получил html-теги, подобные этому в переменной:
$str = '
<p class="class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</p>
<span class="another_class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</span>
<ul class="another_class_style" style="background:#006;"></ul>
<li class="another_class_style" style=" list-style:circle; color:#930;">content</li>';
Позвоните в определенный файл preg_match()
$new_str = preg_match('', $str)
Ожидаемый результат:
$new_str = '
<p>content</p>
<span>content</span>
<ul></ul>
<li>content</li>';
Заметьте, что я не собираюсь снимать html-теги, а мне просто нужно удалить тег-элементы в тегах.
php strip_tags() isn't an option
Был бы благодарен за помощь в этом.
$str = '
<p class="class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</p>
<span class="another_class_style" style="font-size: medium; line-height: normal; letter-spacing: normal;">content</span>
<ul class="another_class_style" style="background:#006;"></ul>
<li class="another_class_style" style=" list-style:circle; color:#930;">content</li>';
$clean = preg_replace('/ .*".*"/', '', $str);
echo $clean;
Вернется:
<p>content</p>
<span>content</span>
<ul></ul>
<li>content</li>
Но, пожалуйста, не используйте регулярное выражение для анализа HTML, используйте парсер DOM.
Хотя регулярное выражение может выполнять эту задачу, обычно рекомендуется использовать функции DOM для фильтрации или других манипуляций с HTML. Вот многоразовый класс, который использует метод DOM для удаления нежелательных свойств. Вы просто задаете те HTML-теги и свойства, которые хотите, и отфильтровываете нежелательные фрагменты HTML.
class allow_some_html_tags {
var $doc = null;
var $xpath = null;
var $allowed_tags = "";
var $allowed_properties = array();
function loadHTML( $html ) {
$this->doc = new DOMDocument();
$html = strip_tags( $html, $this->allowed_tags );
@$this->doc->loadHTML( $html );
$this->xpath = new DOMXPath( $this->doc );
}
function setAllowed( $tags = array(), $properties = array() ) {
foreach( $tags as $allow ) $this->allowed_tags .= "<{$allow}>";
foreach( $properties as $allow ) $this->allowed_properties[$allow] = 1;
}
function getAttributes( $tag ) {
$r = array();
for( $i = 0; $i < $tag->attributes->length; $i++ )
$r[] = $tag->attributes->item($i)->name;
return( $r );
}
function getCleanHTML() {
$tags = $this->xpath->query("//*");
foreach( $tags as $tag ) {
$a = $this->getAttributes( $tag );
foreach( $a as $attribute ) {
if( !isset( $this->allowed_properties[$attribute] ) )
$tag->removeAttribute( $attribute );
}
}
return( strip_tags( $this->doc->saveHTML(), $this->allowed_tags ) );
}
}
Класс дважды использует strip_tags
- один раз, чтобы быстро устранить нежелательные теги, а затем после удаления свойств из остатка он исключает дополнительные теги, вставленные функциями DOM (doctype, html, body). Чтобы использовать, просто выполните следующее:
$comments = new allow_some_html_tags();
$comments->setAllowed( array( "p", "span", "ul", "li" ), array("tabindex") );
$comments->loadHTML( $str );
$clean = $comments->getCleanHTML();
Функция setAllowed принимает два массива - набор допустимых тегов и набор разрешенных свойств (если позже вы решите, что хотите сохранить некоторые из них). Я изменил вашу строку ввода, чтобы добавить добавленное свойство tabindex = "1" где-нибудь, чтобы проиллюстрировать фильтрация. Вывод $ clean:
<p>content</p>
<span>content</span>
<ul tabindex="3"></ul><li>content</li>
Самый простой способ удаления html-тегов в php - strip_tags()
Или вы можете удалить
preg_replace("/<.*?>/", "", $str);