2016-11-23 9 views
1

В моей системе чтения Rss-каналов мне нужно удалить любой существующий блок сценариев, потому что некоторые люди говорят, что это путает XmlReader.Regex - Заменить слишком медленно

Для этого я делаю этот кусок кода, который я нашел в Интернете:

allXml = Regex.Replace(allXml, "(.*)<script type='text/javascript'>.+?</script>(.*)", "$1$2"); 

Но это слишком медленно ... Существует ли способ выполнить это? Я уже пытался сделать матч первым, но это так же медленно, как это:

Match rgx = Regex.Match(allXml, "(.*)<script type='text/javascript'>.+?</script>(.*)"); 

if (rgx.Success) 
    allXml = Regex.Replace(allXml,"(.*)<script type='text/javascript'>.+?</script>(.*)","$1$2"); 
+0

Какой размер 'allXml'? –

+0

И это работает правильно, у вас нет ни слова 'type =" text/javascript "' (двойные кавычки)? Или пробелы. – maraca

+0

Попытайтесь понять, какой код вы выбрали из ** web **. Что это на самом деле. Таким образом, у вас будет ясность в том, что вы на самом деле делаете. Здесь вы ищете '(все) Javascript (все)' ofcourse, это потребует времени, учитывая характер поисковой техники Regular Expression. – Rahul

ответ

1

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

Если вы хотите регулярок быстрый и грязный исправить, отбрасывать (.*) с, а просто использовать

string res = Regex.Replace(allXml, "(?s)<script type='text/javascript'>.*?</script>", "") 

удалить <script>...</script> подстроки. Обратите внимание: (?s) - это встроенный эквивалент модификатора RegexOptions.Singleline (DOTALL), так что . может соответствовать символам новой строки.

Однако лучший способ - использовать парсер HTML, например HtmlAgilityPack.