Вот функция, которую я записал для этой задачи:
static string SanitizeHtml(string html)
{
string acceptable = "script|link|title";
string stringPattern = @"</?(?(?=" + acceptable + @")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:(["",']?).*?\1?)?)*\s*/?>";
return Regex.Replace(html, stringPattern, "sausage");
}
Редактирование: По некоторым причинам я отправил исправление на свой предыдущий ответ как отдельный ответ, таким образом, я консолидирую их здесь.
я объясню regex немного, потому что это немного длинно.
первая часть соответствует открытой скобке и 0 или 1 наклонной черте (в случае, если это - близкий тег).
Следующий Вы видите если тогда конструкция со взглядом вперед. (? (? =SomeTag) then|else) я проверяю, чтобы видеть, является ли следующая часть строки одним из приемлемых тегов. Вы видите, что я связываю строку regex с приемлемой переменной, которая является приемлемыми именами тега, разделенными verticle панелью так, чтобы любое из условий соответствовало. Если бы это - соответствие, Вы видите, что я вставляю слово "notag", потому что никакой тег не соответствовал бы этому и если приемлемо, что я хочу оставить его в покое. Иначе я еще иду дальше к часть, где я соответствую любому имени тега [a-z, A-Z, 0-9] +
Затем, я хочу соответствовать 0 или больше атрибутам, которые я принимаю, находятся в атрибуте формы = "значение". таким образом, теперь я группирую эту часть, представляющую атрибут, но я использую?: препятствовать тому, чтобы эта группа была получена для скорости: (?:\s [a-z, A-Z, 0-9,-] + =? (?: (["" ']?). ? \1?))
Здесь я начинаю с пробельного символа, который был бы между тегом и названиями атрибута, затем соответствовать названию атрибута: [a-z, A-Z, 0-9,-] +
следующий я соответствую, равняется знаку, и затем любой кавычке. Я группирую кавычку, таким образом, она будет получена, и я могу сделать обратную ссылку позже \1 для соответствия тому же типу кавычки. Промежуточный эти две кавычки, Вы видите, что я использую период для соответствия чему-нибудь, однако я использую ленивую версию *? вместо жадной версии * так, чтобы это только соответствовало до следующей кавычки, которая закончила бы это значение.
следующий мы помещаем * после закрытия групп с круглой скобкой так, чтобы это соответствовало нескольким attirbute/value комбинациям (или ни один). В последний раз мы соответствуем некоторому пробелу \s и 0 или 1 конечной наклонной черте в теге для стиля xml сам закрывающие тэги.
Вы видите, что я заменяю теги колбасой, потому что я голоден, но Вы могли заменить их пустой строкой также, чтобы просто убрать их.
Вы можете найти пример здесь .
Фрагмент:
Следующий пример представляет собой входной файл CMake для создания оболочки Python для файла интерфейса SWIG, example.i:
# Это пример CMake для Python FIND_PACKAGE (ТРЕБУЕТСЯ SWIG) ВКЛЮЧИТЬ ($ {SWIG_USE_FILE}) НАЙТИ ПАКЕТ (PythonLibs) INCLUDE_DIRECTORIES ($ {PYTHON_INCLUDE_PATH}) INCLUDE_DIRECTORIES ($ {CMAKE_CURRENT_SOURCE_DIR}) НАБОР (CMAKE_SWIG_FLAGS "") SET_SOURCE_FILES_PROPERTIES (пример.i СВОЙСТВА CPLUSPLUS ON) SET_SOURCE_FILES_PROPERTIES (example.i PROPERTIES SWIG_FLAGS "-включить все") SWIG_ADD_MODULE (пример python example.i example.cxx) SWIG_LINK_LIBRARIES (например, $ {PYTHON_LIBRARIES})