RegEx сопоставление тегов HTML и извлечение текста

У меня есть такой тест:

<customtag>hey</customtag>

Я хочу использовать RegEx для изменения текста между тегами customtag, чтобы он выглядел так:

<customtag>hey, this is changed!</customtag>

Я знаю, что могу использовать MatchEvaluator для изменения текста, но я не уверен в правильном синтаксисе RegEx. Любая помощь приветствуется.

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

Scott Chamberlain 18.02.2012 04:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
38 998
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Используйте XSL или ДОМ.


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

При чем здесь вопрос? Использование регулярного выражения для вопроса OP в том виде, в котором он написан, работает, но что, если содержимое между тегами <customtag> содержит другие теги? Что делать, если в тексте встречается буквальный символ <? Прошло 11 месяцев с тех пор, как Джон Тэкабери задал этот вопрос, и я предполагаю, что за это время сложность его проблемы, возможно, увеличилась.

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

XSL и DOM - это две стандартные технологии, предназначенные для работы с разметкой XML или XHTML. Обе технологии умеют анализировать файлы структурированной разметки, отслеживать вложенные теги и позволяют преобразовывать атрибуты или содержимое тегов.

Вот пара статей о том, как использовать XSL с C#:

Вот пара статей о том, как использовать DOM с C#:

Вот библиотека .NET, которая помогает выполнять операции DOM и XSL с HTML:

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

PhiLho 18.11.2008 23:46

Тогда почему бы вам не показать нам, как это сделать с помощью XSL или DOM на C#? Делать громкие заявления легко. Посмотрим на реальный код. Регулярные выражения не подходят для синтаксического анализа обычного HTML, но они идеально подходят для выполнения определенных действий с конкретным кодом HTML.

Jan Goyvaerts 19.11.2008 10:31

Признаюсь, вы меня рассмешили, но давайте объясним или дадим ссылку на хорошее объяснение того, почему вы предпочли бы откусить себе ногу. Думаю, некоторым программистам действительно очевидно, почему, а может и не новичку?

Sam Murray-Sutton 13.10.2009 13:40
Ответ принят как подходящий

Я бы тоже не стал использовать для этого регулярное выражение, но если вам нужно, это выражение должно работать: <customtag>(.+?)</customtag>

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

Jon Tackabury 18.11.2008 23:25

В качестве предупреждения другим: он не будет работать с правильно сформированным синтаксисом | <customtag> <customtag> Some text </customtag> | </customtag> - область между символами вертикальной черты совпадает, поэтому второй <customtag> будет удален, оставив плохо сформированный XML.

Tom Leys 18.11.2008 23:51

Да, и именно поэтому вам не следует пытаться анализировать xml с помощью регулярного выражения. Вы можете ограничить то, что может находиться между тегами, и просто разрешить буквы, цифры и пробелы, и это будет работать немного лучше. Но тогда он ограничен определенным доменом, поэтому что-то вроде этого: <customtag> ([a-zA-Z0-9]) + </customtag>

Tjofras 19.11.2008 00:08

Или просто <customtag> ([^ <] +) </customtag>. Но да, HTML не является регулярным языком, поэтому в более общем случае вы не можете использовать регулярные выражения для его сопоставления. Это та же проблема, что и при использовании регулярного выражения для соответствия сбалансированным круглым скобкам.

Bill Karwin 19.11.2008 00:22

Если между двумя тегами не будет других тегов, это регулярное выражение будет немного безопаснее и эффективнее:

<customtag>[^<>]*</customtag>
//This is to replace all HTML Text

var re = new RegExp("<[^>]*>", "g");

var x2 = Content.replace(re,"");

//This is to replace all &nbsp;

var x3 = x2.replace(/\u00a0/g,'');

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

Здесь вы можете найти 3 простых примера:

http://jakemdrew.wordpress.com/2012/02/03/getting-only-the-text-displayed-on-a-webpage-using-c/

Другие вопросы по теме