Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачистка повторов в строке 
:(
    Опции темы
PROme
Дата 16.8.2005, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



блин, снова я со своими регами
уже частично выучил, но никак не хватает времени smile СЕО все забирает... а может тут и не регами?
значит проблема не столько в сабже, сколько в его оптимальной реализации, т.к. надо будет значительное количество данных обрабатывать

нужно:

n=>2 пробелов заменять на 1 пробел
m=>1 табуляций заменять на 1 пробел
n=>1 + m=>1 пробелов + табуляций заменять на 1 пробел

как наиболее эффективно это организовать?
ЗЫ: все возможные знаки переноса "(\r\n|\n|\r)" из строки сразу удаляются за ненадобностью


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Bikutoru
Дата 16.8.2005, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Первые два пункта и без регов прекрасно делаются:
Код

$string = <<<DATA
...
DATA;

while (($str = str_replace("\t", " ", $string)) != $string)
  $string = $str;

while (($str = str_replace("  ", " ", $string)) != $string)
  $string = $str;

А вот последний я не очень понял.

Это сообщение отредактировал(а) Bikutoru - 16.8.2005, 09:16


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
PROme
Дата 16.8.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Bikutoru спасибо, ну это и так ясно... мне интересно, сколько ресурсов на это понадобиться? данных очень много, может есть что-то более прогрессивное?

Цитата
А вот последний я не очень понял.

ну если подряд идет один или более пробел и одна или более табуляция (в любом порядке и последовательности), все это надо заменять одним проблеом


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Mal Hack
Дата 16.8.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



А я бы тут регуляркой воспользовался. Чтобы идти по тексту 2 раза.
Код

preg_replace( "#(\s{2,}|\t+|[\s\t]+)#s" , " " , $str );
preg_replace( "#[\n\r]#s" , "" , $str );

PM ICQ   Вверх
Bikutoru
Дата 16.8.2005, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Цитата(PROme @ 16.8.2005, 11:50)
если подряд идет один или более пробел и одна или более табуляция (в любом порядке и последовательности), все это надо заменять одним проблеом

Тогда то, что я написал, уже должно это сделать.

А насчет скорости, str_replace работает намного быстрее, чем preg_replace, но str_replace нужно использовать неоднократно, так что не все так очевидно. Мой совет - поэкспериментируй с разными данными, а результаты выложи сюда... Посмотрим на них и учтем на будующее...



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 16.8.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(Bikutoru @ 16.8.2005, 16:06)
А насчет скорости, str_replace работает намного быстрее, чем preg_replace, но str_replace нужно использовать неоднократно, так что не все так очевидно. Мой совет - поэкспериментируй с разными данными, а результаты выложи сюда... Посмотрим на них и учтем на будующее...

Хм... Ну вот тебе тест (Я оптимизировал регулярки):
Код

<?php

 function getmicrotime()
  {
   $mt = explode( " ", microtime() );
   return ( (float)$mt[0] + (float)$mt[1] );
  }

$string1 = file_get_contents( "preg_test.txt" );

$time_start1 = getmicrotime();

while (($str = str_replace("\t", " ", $string1)) != $string1)
  $string1 = $str;

while (($str = str_replace("  ", " ", $string1)) != $string1)
  $string1 = $str;

$string1 = str_replace( "\r" , "" , $string1 );
$string1 = str_replace( "\n" , "" , $string1 );

$time_end1 = getmicrotime();

$string2 = file_get_contents( "preg_test.txt" );

$time_start2 = getmicrotime();

$string2 = preg_replace( "#[\s\t]+#sS" , " " , $string2 );
$string2 = preg_replace( "#[\n\r]#S" , "" , $string2 );

$time_end2 = getmicrotime();

$test1 = round( ( $time_end1 - $time_start1 ) , 4 );
$test2 = round( ( $time_end2 - $time_start2 ) , 4 );

print "<br><br>Script works " . $test1 . "(1 str), " . $test2 . "(2 reg); Ðàçíèöà" . ( $test2 - $test1 ) . "(2-1) seconds<br><br>";

print "<pre>" . $string1 . "<br><br><br>" . $string2;

?>

Результат:
Код
Script works 0.0046(1 str), 0.0025(2 reg); Разница-0.0021(2-1) seconds
# при файле с двойным содержимом:
Script works 0.0116(1 str), 0.0047(2 reg); Разница-0.0069(2-1) seconds
# четверное
Script works 0.0761(1 str), 0.0118(2 reg); Разница-0.0643(2-1) seconds
# x12
Script works 1.5523(1 str), 0.0603(2 reg); Разница-1.492(2-1) seconds

Работал с файлом 68 килобайт (200 строк где-то). Файл кода. Его и приаттачиваю.

Это сообщение отредактировал(а) Mal Hack - 16.8.2005, 15:40

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  preg_test.txt 66,69 Kb
PM ICQ   Вверх
Bikutoru
Дата 16.8.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Невероятно, но факт! preg_replace быстрее! Даже если убрать циклы!
Пробовал с другими файлами текстового содержимого размером от 15Кб до 300Кб - порядок примерно тот же!

Интересный факт - результаты работы получаются разными: $string1 != $string2 !



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 16.8.2005, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(Bikutoru @ 16.8.2005, 19:08)
Интересный факт - результаты работы получаются разными: $string1 != $string2 !

При рэгах \nпробел остается пробелом без перевода строки, у тебя - стирается, почему - не понимаю smile

ЗЫ: А вся фишка тут в модификаторе S (s - больщое).. В принципе еще можно пару заюзать, но не хочу smile
Попробуй без него smile результат будет прямо противоположный.

Это сообщение отредактировал(а) Mal Hack - 16.8.2005, 18:39
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.