Заменить содержимое в строке на основе Regex.Matches MatchCollection - PullRequest
2 голосов
/ 05 марта 2009

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

У меня есть редактор контента, который пользователи смогут редактировать веб-страницы. Они могут форматировать текст, добавлять ссылки и т. Д. Стандартный материал редактора контента. Когда они нажимают сохранить, редактор предоставляет возможность получить контент (editor.Content) и поместить его в строку. Я хочу получить любые ссылки (теги <a>) и выяснить, являются ли они внутренними или внешними ссылками и являются ли они файлами PDF.

Вот выражение, которое я придумал:

<a\b[^<>]*href\s*=\s*[\""\'](?<domain>https?:\/\/[^\/\s\'\""]*)*\/?(?<path>\/?[^\s\""]+?)?[[>\""\']

С этим я могу разделить домен (если он есть) и путь к нему. Затем я перебираю спички ...

dim matchColl as MatchCollection = Regex.Matches(editorContent, regExString)
For Each m as Match in matchColl
   If m.Groups("domain").value <> myInternalDomain and m.Groups("domain").value <> "" then
       'this is an external domain... do some stuff
   End If
   If m.Groups("path").value.EndsWith(".pdf") then
         'it is a pdf, do some other stuff...
   End if
Next

Мой вопрос заключается в следующем ... части, где я «делаю что-то» со значениями, как лучше всего вернуть это обратно в мою строку «editorContent»? Я мог бы, вероятно, поместить editorContent в StringBuilder и сделать на нем целую кучу замен, но это очень эффективно?

Так, например, в PDF я хочу указать, что он открывается в новом окне (target = "_ blank"), а для внешнего URL-адреса добавить некоторый код JavaScript в атрибут onclick.

Любые идеи будут великолепны!

Спасибо!

1 Ответ

3 голосов
/ 05 марта 2009

Я думаю, что вы хотите сделать Regex.Replace и передать MatchEvaluator. По сути, MatchEvaluator является делегатом функции, которая возвращает замещающую строку.

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