регулярное выражение для php, чтобы найти все самозакрывающиеся теги - PullRequest
1 голос
/ 14 декабря 2010

У меня есть система, которая использует DomDocumentFragment, который создается на основе разметки из базы данных или другой области системы (т.е. другого кода XHTML).

Один из таких тегов:

<div class="clear"></div>

Перед добавлением строки в DomDocumentFragment содержимое корректно - класс закрывается правильно.

Однако DomDocumentFragment преобразует это в:

<div class="clear"/>

Это не отображается правильно в браузерах из-за неправильного закрытия тега.

Таким образом, моя мысль состоит в том, чтобы пост-обработать строку XML, которую DomDocument возвращает мне (включая неверную структуру div, как показано выше), и преобразовать самозакрывающиеся теги обратно в их правильную структуру ... т.е. .

Но у меня возникли проблемы с шаблоном preg_match для поиска этих тегов - я видел некоторые шаблоны, которые возвращают все теги (т.е. находят все теги), но не только те, которые закрываются самостоятельно.

Я пробовал что-то в этом духе, но мою голову немного путают с регулярным выражением (и я начинаю слишком усложнять)

/<div(["\d\w\s])\/>/

Цель - сопоставить шаблон, где "...." может быть любым допустимым атрибутом XHTML.

Любые предложения или указатели, чтобы вернуть меня в нужное русло?

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

Ограничьте проблемную область - вам нужно изменить <div class="clear"/> на <div class="clear"></div> ... поэтому найдите первый и замените его вторым, используя простую операцию поиска и замены.Он должен быть быстрее и определенно безопаснее

Что бы вы ни делали, не пытайтесь анализировать HTML с помощью обычноговыражение (что вы пытаетесь сделать, создав регулярное выражение, которое может обнаружить <div> с произвольными атрибутами.)

0 голосов
/ 14 декабря 2010

Ввод

<div></div>

в DomDocumentFragment фактически не меняет его на

<div/>

меняет его на

A-DOM-Element-Node-with-name-"div"-and-no-content.

Только когда DomDocumentFragment является сериализованным , создается либо <div></div>, либо <div/>. Другими словами, проблема заключается не в DomDocumentFragment, а в используемом вами процессе сериализации.

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

...