На вскидку, еще не проверяя даже код вижу, что есть отличия

Длина искомой строки находится, как разница между ее концом и ее началом т.е. EPos - BPos, а вы делаете наоборот, но основная тонкость даже не в этом. Вы обрабатываете текст как строку, а текст-то у вас содержит еще и переводы каретки, вот и не находится в итоге нужного вхождения. Поэтому вам надо сначала избавится от ненужных спецсимволов, а уже потом искать шаблоны.
Попробуйте так:
Код:
str := StringReplace(str,#13#10,'',[rfReplaceAll]);
while Pos('view.php?ad=',str)>0
do begin
BPos := Pos('view.php?ad=',str)+12;
EPos := Pos('" target="',str);
ListView1.Items[0].SubItems.Append(Copy(str,BPos,EPos - BPos));
Delete(str,1, BPos+12);
end
ПС: Учитесь пользоваться встроенным отладчиком.