StringReplace

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

StringReplace

Сообщение arriah »

Опять обращаюсь с вопросами :)

Есть у меня фукция которая ищет подстроку между двумя символами или словами

Пытаюсь распарсить некую HTML страницу, исходный кот получаю или через tchromium или httpsend - Это неважно, исходник есть.

Далее мне надо удалить все скрипты из кода

Код: Выделить всё

var
 srcHTML:TstringList;
 str:string;
.....
 srcHTML:=TStringList.Create;
 srcHTML.Text:=тут получаем исходный код
 str:=srcHTML.Text;
 str:=StringReplace(str,FindStr(str,'<script','</script>'),'',[rfReplaceAll, rfIgnoreCase]);

Все работает нормально, все между тэгами <script></script> - удаляются, включая сами тэги

Но загвоздка в том, что находится строка

Код: Выделить всё

<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>


вот она никак не хочет удаляться через StringReplace. Хотя через мою функцию FindStr - она ее находит.
проверял просто выводом в мемо, всех скриптов. выводятся все которые есть в исходнике включая тэги <script>. Удаляются тоже все.. а вот вышеприведенная строка, ну никак не хочет...
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

arriah писал(а):вот она никак не хочет удаляться через StringReplace. Хотя через мою функцию FindStr - она ее находит.
проверял просто выводом в мемо, всех скриптов. выводятся все которые есть в исходнике включая тэги <script>. Удаляются тоже все.. а вот вышеприведенная строка, ну никак не хочет...

Ищите банально ручками удаляя по одной букве, там есть какой-то символ (или много), которые отрубают StringReplace. Как только найдёте, то удаляйте эти символы другой функцией, до того как делаете StringReplace. Либо, после прохода StringReplace - делайте контрольный проход вашей FindStr
Аватара пользователя
beria
постоялец
Сообщения: 130
Зарегистрирован: 29.09.2016 07:57:13

Сообщение beria »

arriah писал(а): StringReplace


Сам буквально недавно с этим столкнулся и вообще забил на StringReplace ибо тормоз. свою процедуру написал и не парюсь. Сначала сделайте прогон для формирования массива вхождений подстроки или вообще любых маркеров кои нужны, к примеру SGML мнемоники. А потом уж по этому массиву формируйте выходную строку как хотите. Скорость работы и универсальность - две большие разницы получились.
Также можете посмотреть описание семейства стандартных процедур FindMatchesBoyerMooreCaseSensitive. Тот же поиск, только сильно оптимизированный для больших строк по алгоритму Байера-Мура
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

vitaly_l писал(а):
arriah писал(а):вот она никак не хочет удаляться через StringReplace. Хотя через мою функцию FindStr - она ее находит.
проверял просто выводом в мемо, всех скриптов. выводятся все которые есть в исходнике включая тэги <script>. Удаляются тоже все.. а вот вышеприведенная строка, ну никак не хочет...

Ищите банально ручками удаляя по одной букве, там есть какой-то символ (или много), которые отрубают StringReplace. Как только найдёте, то удаляйте эти символы другой функцией, до того как делаете StringReplace. Либо, после прохода StringReplace - делайте контрольный проход вашей FindStr


Интересно...

сделал дважды вызов:

Код: Выделить всё

str:=StringReplace(str,FindStr(str,'<script','</script>'),'',[rfReplaceAll, rfIgnoreCase]);
str:=StringReplace(str,FindStr(str,'<script','</script>'),'',[rfReplaceAll, rfIgnoreCase]);


и все удалилось. Вобще ничего не понимаю...
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

arriah писал(а):str:=StringReplace(str,FindStr(str,'<script','</script>'),'',[rfReplaceAll, rfIgnoreCase]);

так она не будет удалятся ...'<script' замещается на '</script>' в тексте.. rfReplaceAll - все нахождения '<script' будут заменены на '</script>'
rfIgnoreCase - плевать на высоту букв..
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

olegy123 писал(а):так она не будет удалятся ...'<script' замещается на '</script>' в тексте..

Это с чего вдруг? Моя функция находит все что между <script и </scrip> и далее Replace должен по все тексту заменить найденую подстроку на "пусто", то есть удалить.
Ответить