Могут ли парсеры dom читать внутри комментариев HTML, или Regex - единственный способ - PullRequest
2 голосов
/ 15 июня 2009

Я создаю очень простую CMS для своей организации.

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

<!-- <editable name="news_item> Today's news is ... </editable> -->

С контентом "Сегодняшние новости ...", который получает CMS и делает его редактируемым в онлайн-редакторе HTML.

Я бы хотел иметь возможность "захватить" значение атрибута name, а также содержимое, содержащееся в тегах.

Есть ли простой способ сделать это с помощью XPath, типа XQuey, или это регулярное выражение - лучший путь (] особенно если учесть, что регулярному выражению не потребуется слишком большая отказоустойчивость, так как я точно знаю, что будет XML быть, потому что я буду писать код, который его генерирует).

Ответы [ 6 ]

3 голосов
/ 15 июня 2009

Под DOM Parser вы имеете в виду javascript? Если это так, этот блог предполагает, что вы действительно можете нарезать и нарезать кубиками комментарии HTML. И поскольку упоминание javascript без упоминания jQuery является грехом, вот плагин jQuery, который найдет все комментарии HTML для вас.

3 голосов
/ 15 июня 2009

Большинство парсеров могут получать комментарии без проблем. Вероятно, они не будут анализировать их в структуре DOM, но вы можете сделать это вручную, когда получите реальные комментарии.

Это пример использования BeautifulSoup с Python:

>>> from BeautifulSoup import BeautifulSoup, Comment
>>> html_document = """
... <html>
... <head>
... </head>
... <body>
... <h1>My Html Document</h1>
... <!-- This is a normal comment. -->
... <p>This is some more text.</p>
... <!-- <editable name="news_item">Today's news is Paolo Rocks!</editable> -->
... <p>Yet More Content</p>
... </body>
... </html>
... """
>>> soup = BeautifulSoup(html_document)
>>> comments = soup.findAll(text=lambda text:isinstance(text,Comment))
>>> comments
[u' This is a normal comment. ', u' <editable name="news_item">Today\'s news is
Paolo Rocks!</editable> ']
>>> for comment in comments:
...     editable = BeautifulSoup(comment).find('editable')
...     if editable is not None:
...             print editable['name'], editable.contents
...
news_item [u"Today's news is Paolo Rocks!"]
2 голосов
/ 15 июня 2009

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

Я бы не хотел использовать RegEx в этом случае.

Однако, если вы уверены, что контент представляет собой HTML, вы должны создать элемент DOM (скажем, DIV) и назначить текст комментария для innerHTML. Вы можете изучить DOM, созданный из элемента. Как только вы получите то, что вам нужно, вы можете удалить элемент DIV, который вы никогда бы не добавили в текущий документ.

0 голосов
/ 15 июня 2009

Если вы используете PHP.

    $xpath = new DOMXpath(new DOMDocument());

    // Search for comments
    $comments = $xpath->query('//comment()');
0 голосов
/ 15 июня 2009

Вы можете использовать DIV с атрибутом costum, как это делает Dojo:

<div ParseByCMS="true">foobar foo bar foobaz</div>

После этого вы просто используете javascript или xslt для его анализа и удаления.

0 голосов
/ 15 июня 2009

Я уверен, что вам нужно будет вручную проанализировать его с помощью регулярных выражений или другого метода. Насколько мне известно, комментарии не рассматриваются как элементы DOM.

...