Нужна помощь в удалении определенных HTML-тегов из файла

#php #preg-replace

#php #preg-заменить

Вопрос:

У меня есть HTML в файле, который я хочу удалить. Вот примеры:

 <a name="0.3__Toc308117073"></a>

<h1><a name="0.3__Toc308117071"></a><font color="#3B608D" size="4" face="Cambria"><b>Gains on Sales of Qualified Small Business Stock</b></font></h1>
  

Я хочу удалить теги привязки, и я хочу удалить теги h1 и все, что между ними. Какой был бы правильный синтаксис для preg_replace или чего-то подобного?

Комментарии:

1. на примере выше: $result = "nn";

2. Не используйте регулярные выражения для этого. Используйте анализатор HTML.

Ответ №1:

Из чего-то похожего отдела: QueryPath.

 $html = htmlqp($html)
         ->top()->remove("a[name]")
         ->top()->remove("h1")
         ->top()->xhtml();
  

Для этого вы можете использовать регулярное выражение. Но это больше работы.

Ответ №2:

Вы должны указать, какие части исправлены, а какие могут отличаться от случая к случаю. Меня особенно интересует имя привязки. Будет ли «0.3_Toc» единственной фиксированной частью, или часть числа также фиксирована? Как насчет 0.2_Toc?

Если для вас нормально использовать два регулярных выражения, тогда используйте что-то вроде этих шаблонов в таком порядке:

 <h1><a name="0.3__Tocd*">.*</a>.*</h1>
<a name="0.3__Tocd*">.*</a>
  

Если вам абсолютно необходимо сделать это в одном регулярном выражении, вам придется продвинуть это с помощью некоторых поисковых систем, чтобы уловить оба случая. И это болезненно (но весело, я думаю). 🙂

Редактировать: Ок. Я предположил, что вам нужны только h1-теги с такими якорями, а также любые свободные якоря такого типа. Если цель состоит в том, чтобы удалить все теги h1 с содержимым и все теги привязки, вы можете использовать это вместо:

 (<h1>.*</h1>)|(<a name=".*">.*</a>)
  

Так что это был бы вызов

 preg_replace('/(<h1>.*</h1>)|(<a name=".*">.*</a>)/im', '', $htmlToStrip);
  

Комментарии:

1. Просто ищем <h1> что угодно </h1> и удаляем весь блок в одной цели, а затем ищем <a name= что угодно </a> и удаляем этот тег — это вторая цель. Теги привязки также находятся за пределами тегов <h1>, поэтому я прошу прощения, если это сбивает с толку.

2. Может быть, что-то вроде этого… $regex = '<a name=".*__Tocd*">.*</a>'; $content = preg_replace($regex,"",$content); и $regex = '<h1>.*</h1>'; $content = preg_replace($regex,"",$content);

3. Я получаю Warning: preg_replace() [function.preg-replace]: Unknown modifier 'h' in при запуске скрипта.

4. Извините за это. Пришлось избегать некоторых косых черт при выполнении регулярного выражения в php, которое появляется.

5. Окончательное решение: $content = preg_replace('@<h1[^>]*?>.*?</h1>@si', '', $content); $content = preg_replace('@<a name=[^>]*?>.*?</a>@si', '', $content);

Ответ №3:

Это регулярное выражение соответствует всем тегам (таким образом, оставляя вас с не-HTML):

 /(<[^<>] >)/
  

Вы могли бы выполнить preg_match_all(). Однако на самом деле вам следует использовать HTML-анализатор, как предложили ‘mario’ и ‘ThiefMaster’.