Нужны советы по поводу оптимизации функции вырезания заданной подстроки

12
[Удален]
704

Задача вырезать с отпарсенной страницы все теги ссылок. Написал следующую функцию:


///////////////////// удаляем сcылки
$contentBlock=KAstr_ALL_replace($contentBlock,"<a",">","");
$contentBlock=str_ireplace("</a>","",$contentBlock);

//Замета всех участкок строки $string, начинающихся подстрокой $begin и заканчивающегося подстрокой $end. Вместо этих участков вставляется $replacement
function KAstr_ALL_replace($string, $begin, $end, $replacement)
{
$posopen=0;
while(1)
{
$posopen = stripos($string,$begin,$posopen);
if($posopen===false)return $string;//!!!!!!

$posclose = stripos($string,$end,$posopen+strlen($begin));
if($posclose===false)return $string; //!!!!!!!

$length = $posclose-$posopen+strlen($end);

$string=substr($string,0,$posopen).substr($string,$posclose+strlen($end),strlen($string)-($posclose+strlen($end)));
}
}

Проблема в том, что например для данной страницы http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F - функция выполняется около 40 секунд. Можно ли это дело как нибудь ускорить?

skAmZ
На сайте с 04.09.2009
Offline
122
#1
plamar:
//Замета*всех*участкок*строки*$string,*начинающихся*подстрокой*$begin*и*заканчивающегося*подстрокой*$end.*Вместо*этих*участков*вставляется*$replacement

preg_replace

Например удаление всех тегов: preg_replace('/<[^>]+>/i', '', $content);

Или ваш пример с тегом а: preg_replace('/<(\/)?a( [^>]*)?>/i', '', $content);

[Удален]
#2

сомневаюсь, что регулярные выражения быстрее простых строковых функций, но щас попробую

ewg777
На сайте с 04.06.2007
Offline
225
#3
plamar:
сомневаюсь, что регулярные выражения быстрее простых строковых функций, но щас попробую

Но Ваши 40 секунд обгонят.

[Удален]
#4
ewg777:
Но Ваши 40 секунд обгонят.

да, должен заметить что скорость значительно выросла))) спасибо за подсказку, только я так понимаю это регулярное выражение не учитывает случаи когда верстальщик перенес часть кода ссылки на другую строку?

skAmZ
На сайте с 04.09.2009
Offline
122
#5
plamar:
только я так понимаю это регулярное выражение не учитывает случаи когда верстальщик перенес часть кода ссылки на другую строку?

Учитывает)

[Удален]
#6

регулярки придумывали лди с образованием математическим, а не пхп кодеры, поэтмоу они быстрее :)

kil
На сайте с 03.04.2006
Offline
84
kil
#7

Чего-то у вас с "простыми строковыми функциями" уж очень напутано!

Как вариант:


function KAstr_ALL_replace($string)
{
return preg_replace("/<a(.*?)>(.*?)<\/a>/i", "\\2", $string);
}

Если содержимое между <a> и </a> надо сохранить.

[Удален]
#8


function KAstr_ALL_replace($string)
{
return preg_replace('#</?a[^>]*>#i', "", $string);
}
kil
На сайте с 03.04.2006
Offline
84
kil
#9
bearman:

function KAstr_ALL_replace($string)
{
return preg_replace('#</?a[^>]+>#i', "", $string);
}

Опс. Так еще проще! :)

Я смотрел на задачу немного с другой точки зрения.

skAmZ
На сайте с 04.09.2009
Offline
122
#10
plamar:
только я так понимаю это регулярное выражение не учитывает случаи когда верстальщик перенес часть кода ссылки на другую строку?

kil, к вашему коду относится)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий