Когда мудро использовать регулярные выражения с HTML? [закрытый]

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

, Но существуют причины кроме эффективности, почему Вы могли бы предпочесть один по другому. Один подход, делает его намного более ясным кому-то читающему код относительно зависимостей, которые имеет этот модуль. У них также есть совсем другие характеристики отказа - первое перестанет работать во время загрузки, если не будет никакого модуля "даты и времени", в то время как второе не перестанет работать, пока метод не называют.

Добавленное Примечание: В IronPython, импорт может быть вполне немного более дорогим, чем в CPython, потому что код в основном компилируется, когда это импортируется.

8
задан Matteo Riva 28 September 2010 в 18:17
поделиться

9 ответов

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

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

11
ответ дан 5 December 2019 в 06:53
поделиться

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

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

Регулярные выражения - мощный инструмент, который может изучить программист, но вам также нужно знать , когда использовать это и когда использовать что-то другое.

4
ответ дан 5 December 2019 в 06:53
поделиться

Нет, это невозможно.

Вы не можете указать браузеру, что нужно отображать фрагмент текста по-другому, не изменяя DOM, независимо от того, делаете ли вы это статически или динамически (например, с помощью Javascript в качестве этапа пост-обработки).

использовать регулярные выражения при разборе HTML - плохая идея. Мы должны научить этому начинающих разработчиков. Хотя это, по-видимому, нескончаемая работа. Но мы также должны научить их очень реальной разнице между синтаксическим анализом HTML и простой целесообразностью обработки нескольких строк. И как определить, какой подход является правильным для поставленной задачи ».

Более подробную информацию можно найти в сообщениях, упомянутых выше.

3
ответ дан 5 December 2019 в 06:53
поделиться

Очевидно, что в самых простых случаях, таких как

<a>Test</a>

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

< A > Test</a>                // match
< a href="test">   Test</a>   // match
< A TEST="test"/>             // no match
< a href="test<">Test</A>     // invalid input - catch that with a regex!

, что регулярное выражение для их надежного перехвата становится ОГРОМНЫМ. Парсер на основе DOM проанализирует его, выдаст вам правильное сообщение об ошибке в случае сбоя и предоставит стабильные результаты.

2
ответ дан 5 December 2019 в 06:53
поделиться

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

В другими словами, не , когда вам нужно выражение для поиска совпадающих тегов / конечных тегов, и не , когда контент, который вам нужно сопоставить, может содержать вложенные теги, комментарии, разделы CDATA и т. д.

1
ответ дан 5 December 2019 в 06:53
поделиться

Если информация, которую вы используете, имеет обычную грамматику, то регулярные выражения отлично подойдут. HTML не имеет регулярной грамматики, поэтому все обстоит сложнее.

Регулярные выражения подходят, если вы на 100% знаете, что именно вы ищете - заменив:

<tag>Info</tag>

на

<tag>Dave</tag>

В документе, который вы иметь полный контроль, имеет смысл, но реальный HTML не такой.

1
ответ дан 5 December 2019 в 06:53
поделиться

Когда вы знаете, что делаете!

; )

1
ответ дан 5 December 2019 в 06:53
поделиться

You can use regexp when either you parse HTML you have control over or you are writing a parser for one specific HTML page. You should not use regexp when trying to build universal parser.

0
ответ дан 5 December 2019 в 06:53
поделиться

Следует иметь в виду, что есть два основных источника возражений против обработки HTML с помощью регулярных выражений. Один из источников связан с вероятностью нежелательного HTML, который имеет непредсказуемо искаженный формат. Это само по себе является законной причиной для скептицизма при подходе к обработке HTML с помощью регулярных выражений и с самого начала отбрасывает множество вариантов использования. Проблема в том, что этот источник часто используется, чтобы «выплеснуть ребенка вместе с водой из ванны», а также часто приравнивается ко второму основному источнику возражений (и обычно оба остаются невысказанными), даже если они совершенно не связаны

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

  1. Трюизм: регулярные выражения обрабатывают регулярные грамматики.
  2. Трюизм: HTML не является регулярной грамматикой.
  3. HTML не может быть обработан с помощью регулярных выражений.

Я думаю, что многие люди на самом деле просто принимайте эти истины за чистую монету, не задумываясь о том, что они под ними подразумевают. Билл Карвин в другом ответе здесь упомянул некоторые случаи, когда HTML не является обычной грамматикой, но этот аргумент разваливается, когда контекст представляет собой механизм «регулярных выражений», который имеет нерегулярные функции (например, обратные ссылки или даже рекурсию). Эти функции решают многие возражения против "нестандартной грамматики", но все же могут давать сбой при работе с некорректными документами.

Это различие проводится редко, и оно ' Мы редко указывали на то, что большинство современных библиотек «регулярных» выражений имеют возможности, выходящие далеко за рамки обработки обычных языков. Я думаю, что это важные вещи, которые следует учитывать при оценке «регулярных» выражений для соответствующего инструмента для обработки некоторого HTML.

1
ответ дан 5 December 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: