PHP Preg_Replace данные между тегами, соблюдая другие теги в документе - PullRequest
0 голосов
/ 18 марта 2011

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

Я пытаюсь собрать содержимое каждого

<content><div>CONTENT</div></content>

Содержимое необходимо вернуть как обратную ссылку ($1). И содержимое, и div имеют разные параметры (например, style="color: white;"). Эти параметры не важны, но, тем не менее, существуют.

Сложность в том, что div может содержать дочерние div. Это не важно, но конфликтует с моим текущим регулярным выражением - преждевременная остановка матча.

Вот пример кода, представьте себе эту копию / вставленную несколько раз и отформатированную по-разному.

<entry> 
<title>A general title of a post</title> 
<content type="xhtml"> 
    <div xmlns="http://www.w3.org/1999/xhtml"> 
    This is a description of the title. It may <b>contain bold text</b> or <div>even divs</div>, and everything else. It is not quite important to save these tags, but they exist nonetheless.
    </div> 
</content> 
</entry>

В настоящее время я использую два кода регулярных выражений. Один для объявления и один для закрывающих тегов. Это работает, но теперь мне нужно выполнить код на содержание. Итак, я буду использовать preg_replace_callback(), но я не могу понять, как соединить два, чтобы середина была обратным вызовом.

Декларация:

<content \w+\s*=\s*\".*?\">[\r\n\s]{0,}<div \w+\s*=\s*\".*?\">

Закрытие:

</div>[\r\n\s]{0,}</content>

Мне нужно объединить их с содержимым, возвращаемым в качестве обратного вызова. Я пробовал что-то вроде ([\w\W]{0,}), которое возвращает абсолютно все, но это совпадение не останавливается на заключительном div.

Итак, я узнал о команде \bFULLWORD\b и бросил \bdiv\b на это ... Но у меня не получилось добиться того, чтобы это сработало. Возможно, это не поддерживается PHP? Или я тупой.

Я не знаю.

Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

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

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

Как указано в комментариях, вы можете легко использовать класс DOM в PHP.

Вы хотите сделать это по нескольким причинам:

  • Это проще, вам не нужно создавать какой-то сумасшедший узор, похожий на кошку, которая ходила по вашей клавиатуре
  • Проще (опять же), вы можете перейти к конкретному узлу, а не работать со всем документом.
  • Это безопаснее, вы случайно не измените то, что не хотели
  • Это безопаснее (опять же), исходные данные могут измениться, и вы можете обнаружить их и объяснить это.
  • Это безопаснее (снова снова), вы можете потерпеть неудачу изящно.

Как?

0 голосов
/ 18 марта 2011

Используйте DOM-парсер.Вот пример: http://htmlparsing.com/php.html

...