Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Скорость работы.


Автор: webaliser 31.12.2007, 15:32
Добрый день, уважаемые профессионалы!

Интересует вопрос теоретического характера: 

Дана текстовая переменная. 

1. Нужно произвести поиск фразы по переменной и зафиксировать позиции найденных фраз.
2. Нужно заменить все фразы переменной другой фразой (регистро-чувствительно smile )
3. Чтение контента между фразами 1 и 2 и его замена.

Не скрываю, цель - узкоспециализированный шаблонизатор. Но до этого далеко. Приветствуются не только примеры, но и посылания на правильный поиск и доку smile

всем спс.!

з.ы. Всех с наступащим

Автор: Alex13 1.1.2008, 13:56
webaliser, 
1) strpos()
2) str_replace()
3) strstr() + strpos()

Если ничего не напутал с именами, то это - то, что вам требуется smile

Автор: Daevaorn 3.1.2008, 21:58
Регулярные выражения.

Автор: Alex13 4.1.2008, 09:10
Daevaorn, так они же, согласно документации, медленнее, чем обычные строковые функции?.. Разве нет?

Автор: skyboy 4.1.2008, 10:52
если просто заменить - то http://php.net/str_replace и правда за глаза хватит.
с другой стороны, не совсем понятно
Цитата(webaliser @  31.12.2007,  14:32 Найти цитируемый пост)
3. Чтение контента между фразами 1 и 2 и его замена.

возможно, через регулярные выражения будет яснее.
насчет скорости: надеюсь, это было действительно узкое по скорости место, что вместо гибкости ищется наиболее быстрое решение. В слысле, что запрос к БД не возщвращает в 100 раз больше строк, чем нужно, которые затем фильтруются на стороне РНР, вместо БД не используются файлы и прочие огрехи архитектуры убиты, и дело осталось только за оптимизацией на уровне функций...

Автор: Alex13 4.1.2008, 11:00
skyboy, я не возьмусь гарантировать выигрыш в скорости, тк не замерял, но это можно сделать с помощью двух вызовов strpos() и одного substr_replace().

Автор: Daevaorn 5.1.2008, 02:23
Цитата(Alex13 @  4.1.2008,  10:10 Найти цитируемый пост)
так они же, согласно документации, медленнее, чем обычные строковые функции?.. Разве нет? 

В простых случаях чуть-чуть медленнее наверно. Но за-то они более гибкие и позволят в последствии расширить функционал "почти даром".

Автор: Alpha 14.1.2008, 11:48
Alex13, поправьте меня, если я не прав, но
strpos — Возвращает позицию первого вхождения подстроки
А Нужно произвести поиск фразы по переменной и зафиксировать позиции найденных фраз..

Это можно добиться например используя preg_match_all с флагом PREG_OFFSET_CAPTURE.

По третьему пункту помоему целесообразно использовать preg_replace, тем более что если были совпадения с шаблоном, будет возвращено измененное значение.

Ну и, как было сказано выше, гибкость..

Автор: gemaglabin 10.2.2008, 14:08
Для третьей задачи решение может быть двух типов

- копирование текста до конца первой фразы
- копирование текста с начала второй фразы и до конца строки
- объединение текста вида пункт1 . заменяемый текст . пункт2

Код

function str_mreplace ( $string , $phrase1 , $phrase2 , $text )
{
        
    $str_first    = substr ( $string , 0 , strpos ( $string , $phrase1 ) + strlen ( $phrase1) + 1 );
    $str_final    = substr ( $string , strpos ( $string , $phrase2 ) , strlen( $string ) );
    return $str_first . $text . $str_final;
        
}


или

- копирование текста от начала первой фразы до конца второй
- использование стандартной функции str_replace вида первая фраза . заменяемый текст . вторая фраза
Код

function str_sreplace  ( $string , $phrase1 , $phrase2 , $text )
{
    $str_temp    = substr ( $string , strpos ( $string , $phrase1 ) );
    $str_temp    = substr ( $str_temp , 0 , strpos ( $str_temp , $phrase2 ) + strlen ( $phrase2 ) );
    return str_replace     ( $str_temp , $phrase1 . $text . $phrase2 , $string);

}


Средняя скорость выполнения пяти тысяч на моем ноутбуке первого алгоритма 0.1200 сек , второго - 0.1500 сек . Наверное , алгоритмы не самые лучшие , но , думаю , такая мизерная разница неважна.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)