Как убрать таблицу, tr, td тег в html с помощью php
У меня есть HTML-код:
<table id="table1" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
<tr>
<td>
<img src="http://vnexpress.net/Files/Subject/3b/bd/ac/f9/cuongbibat.jpg" width="330" height="441" border="1" alt="Cường">
</td>
</tr>
<tr>
<td class="Image">Everything
</td>
</tr>
</table>
<table id="table2" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
<tr>
<td>
Someone
</td>
</tr>
<tr>
<td class="Image">Everything
</td>
</tr>
</table>
У меня есть 2 таблицы, я хочу удалить все теги: таблица, tr, td, если в таблице есть тег img (таблица 1). Мне нужно получить результат как:
<img src="http://vnexpress.net/Files/Subject/3b/bd/ac/f9/cuongbibat.jpg" width="330" height="441" border="1" alt="Cường">
Everything
<table id="table2" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
<tr>
<td>
Someone
</td>
</tr>
<tr>
<td class="text">Everything
</td>
</tr>
</table>
Пожалуйста, помогите мне. Спасибо.
5 ответов
Теоретически, это можно сделать с помощью одного очень сложного регулярного выражения. Всегда проще выполнять поиск и замену на отдельных этапах: сначала найдите внешний контейнер, а затем поработайте над тем, что в нем содержится.
<?php
header("Content-type: text/plain");
$html = '<table id="table1" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
<tr>
<td>
<img src="http://vnexpress.net/Files/Subject/3b/bd/ac/f9/cuongbibat.jpg" width="330" height="441" border="1" alt="Cường">
</td>
</tr>
<tr>
<td class="Image">Everything
</td>
</tr>
</table>
<table id="table2" border="0" cellspacing="0" cellpadding="3" width="1" align="center">
<tr>
<td>
Someone
</td>
</tr>
<tr>
<td class="Image">Everything
</td>
</tr>
</table> ';
$html = preg_replace_callback('/<table\b[^>]*>.*?<\/table>/si', 'removeTableIfImg', $html);
function removeTableIfImg($matches) {
$table = $matches[0];
return preg_match('/<img\b[^>]*>/i', $table, $img)
? preg_replace('/<\/?(?:table|td|tr)\b[^>]*>\s*/i', '', $table)
: $table;
}
echo $html;
?>
Первый шаблон находит таблицы. Второй шаблон (в обратном вызове) проверяет наличие тега изображения. Третий удаляет теги table, td и tr.
HTML Purifier может использоваться для удаления всех тегов или определенного набора тегов из документа. Это идеальное решение для практически любого удаления тегов HTML в PHP - никогда не используйте для этого регулярные выражения, иначе солнце сгорит, и мы все замерзнем в удушающей темноте.
Попробуйте что-то вроде:
$config->set('HTML.Allowed', 'img');
$purifier = new HTMLPurifier($config);
$output = $filter->purify($YOUR_HTML);
Вам нужно будет добавить $config->set('HTML.Allowed', 'TAGNAME');
линия для каждой метки, которую вы не хотите убирать, но это цена, которую стоит заплатить за продолжительное жизненное тепло дневной звезды. И также не оставляю ваш сайт открытым для XSS-атак и глюков поедания контента, я думаю.
Проверьте: http://simplehtmldom.sourceforge.net/
Давайте найдем теги на странице HTML с селекторами, похожими на jQuery, и извлечем содержимое из HTML в одну строку.
Мне нужно что-то вроде этого. вот мое решение:(<\/?tr.*?>)|(<\/?td.*?>)|(<\/?table.*?>)
это регулярное выражение выберет все теги tr td и table, не являющиеся жадными.
Вы можете увидеть это в действии здесь:
Как сказано выше, не используйте регулярные выражения для этого, это сведет вас с ума. Обычно поиск библиотек занимает столько же времени, сколько и написание собственного небольшого парсера для этого. Я делал это несколько раз на разных языках. Вы многому научились и часто можете повторно использовать код:-)
поскольку вас не интересуют атрибуты, это должно быть довольно просто. Цикл входа на сайт char by char. Посмотрите на этот Java-код, один из моих ранних, меньших подходов к очистке HTML:
public static String sanatize(String body, String[] whiteList, String tagSeperator, String seperate) {
StringBuilder out = new StringBuilder();
StringBuilder tag = new StringBuilder();
boolean quoteOpen = false;
boolean tagOpen = false;
for(int i=0;i<body.length();i++) {
char c = body.charAt(i);
if(i<body.length()-1 && c == '<' && !quoteOpen && body.charAt(i+1) != '!') {
tagOpen = true;
tag.append(c);
} else if(c == '>' && !quoteOpen && tagOpen) {
tag.append(c);
for (String tagName : whiteList) {
String stag = tag.toString().toLowerCase();
if (stag.startsWith("</"+tagName+" ") || stag.startsWith("</"+tagName+">") || stag.startsWith("<"+tagName+" ") || stag.startsWith("<"+tagName+">")) {
out.append(tag);
} else if (stag.startsWith("</") && tagSeperator != null) {
if (seperate.length()>2) {
if (seperate.contains("," + stag.replaceAll("[</]+(\\w+)[\\s>].*", "$1") + ",")) {
out.append(tagSeperator);
}
} else {
if (!out.toString().endsWith(tagSeperator)) {
out.append(tagSeperator);
}
}
}
}
tag = new StringBuilder();
tagOpen = false;
} else if (c == '"' && !quoteOpen) {
quoteOpen = true;
if (tagOpen)
tag.append(c);
else
out.append(c);
} else if (i>1 && c == '"' && quoteOpen && body.charAt(i-1) != '\\' ) {
quoteOpen = false;
if (tagOpen)
tag.append(c);
else
out.append(c);
} else {
if (tagOpen)
tag.append(c);
else
out.append(c);
}
}
return out.toString();
}
Вы можете игнорировать разделитель и разделить, я использовал это для очистки тегов и преобразования в CSV