#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’.