StringReplace

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

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

StringReplace

Сообщение arriah » 20.01.2017 01:06:14

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

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

Пытаюсь распарсить некую 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>. Удаляются тоже все.. а вот вышеприведенная строка, ну никак не хочет...
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: StringReplace

Сообщение vitaly_l » 20.01.2017 02:12:01

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

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

Re: StringReplace

Сообщение beria » 20.01.2017 03:07:13

arriah писал(а): StringReplace


Сам буквально недавно с этим столкнулся и вообще забил на StringReplace ибо тормоз. свою процедуру написал и не парюсь. Сначала сделайте прогон для формирования массива вхождений подстроки или вообще любых маркеров кои нужны, к примеру SGML мнемоники. А потом уж по этому массиву формируйте выходную строку как хотите. Скорость работы и универсальность - две большие разницы получились.
Также можете посмотреть описание семейства стандартных процедур FindMatchesBoyerMooreCaseSensitive. Тот же поиск, только сильно оптимизированный для больших строк по алгоритму Байера-Мура
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: StringReplace

Сообщение arriah » 20.01.2017 11:56:18

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]);


и все удалилось. Вобще ничего не понимаю...
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: StringReplace

Сообщение olegy123 » 20.01.2017 12:22:41

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

так она не будет удалятся ...'<script' замещается на '</script>' в тексте.. rfReplaceAll - все нахождения '<script' будут заменены на '</script>'
rfIgnoreCase - плевать на высоту букв..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: StringReplace

Сообщение arriah » 20.01.2017 13:07:34

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

Это с чего вдруг? Моя функция находит все что между <script и </scrip> и далее Replace должен по все тексту заменить найденую подстроку на "пусто", то есть удалить.
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 70

Рейтинг@Mail.ru