Экранирование -> и => при разборе HTML с использованием регулярного выражения - PullRequest
0 голосов
/ 03 марта 2009

Мне нужно проанализировать и вернуть тэг и атрибуты в наших файлах кода PHP:

<ct:tagname attr="attr1" attr="attr2">

Для этого было построено следующее регулярное выражение:

(\<ct:([^\s\>]*)([^\>]*)\>)

Это выражение работает, как и ожидалось, но прерывается при разборе следующего кода

<ct:form/input type="attr1" value="$item->field">

Исходное регулярное выражение разрывается из-за символа> в поле $ item->. Мне нужно создать регулярное выражение, которое игнорирует -> или =>, но не одиночное>.

Я открыт для любых предложений ... Спасибо за вашу помощь заранее.

Ответы [ 5 ]

2 голосов
/ 03 марта 2009

Попробуйте это:

<ct:([^\s\>]*)((?:\s+\w+\s*=\s*(?:"[^"]*"|'[^']*')\s*)*)>

Но если это XML, лучше использовать синтаксический анализатор XML.

1 голос
/ 03 марта 2009

В общем, любая проблема синтаксического анализа быстро наталкивается на языковые конструкции, которые не зависят от контекста, но не являются регулярными. Возможно, лучшим решением будет [1] написать анализатор без контекста, игнорирующий все, кроме интересующих вас элементов.

[1] «лучше» с точки зрения того, чтобы быть правильным, не обязательно окупаемость.

1 голос
/ 03 марта 2009

Вы можете попробовать использовать отрицательный вид сзади:

(\<ct:([^\s\>]*)(.*?)(?<!-|=)\>)

Совпадения:

<ct:tagname attr="attr1" attr="attr2">
<ct:form/input type="attr1" value="$item->field">

Не уверен, что это лучшее решение для вашего случая, но с учетом ограничений.

0 голосов
/ 03 марта 2009

Мое предложение должно соответствовать атрибутам в том же выражении.

\<ct:([^\s\>]*)((([a-x0-9]+)=\"([^\"]*)\")*)\>

edit: удалена часть о> недействительности xml в значениях атрибута.

0 голосов
/ 03 марта 2009

Я думаю, что вы хотите не распознавать -> и =>, но игнорировать все между парами кавычек.

Я думаю, что это можно сделать, вставив ((

("[^"]*")*

)) в подходящем месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...