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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильность регулярки 
:(
    Опции темы
MoLeX
Дата 7.2.2012, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: нет
Всего: 140



Добрый день. 
Для того, чтобы избавится от повторяющих пробелов и управляющих символов (\r, \n, \t) использую следующее
Код

$html = "<!DOCTYPE html>
<html>    <head>
<title>Title</title>
</head>
<body>
              <div>   test&nbsp;&nbsp;&nbsp;&nbsp;test   </div>
</body>
</html>";

$html = preg_replace( "/[[:cntrl:]]/", "", $html );
$html = preg_replace("/ +/i", " ", $html);

echo $html;
/*
<!DOCTYPE html><html> <head><title>Title</title></head><body> <div> test&nbsp;&nbsp;&nbsp;&nbsp;test </div></body></html>
*/


Верна ли данная конструкция? Сильно ли она прожорлива и как её можно оптимизировать


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ayax2005
Дата 7.2.2012, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


echo $smile
**


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

Репутация: нет
Всего: 11



А зачем вообще это нужно? Контролировать пробелы правильнее на шаге тформирования контента в цмске, это сэкономит ресурсы при отображении; а управляющие символы чем помешали - ума не преложу.
Конечно, регулярка на боле-менее объёмный документ потребует времени на обработку.



--------------------
все вопросы - из-за неверной формулировки задачи
PM MAIL ICQ   Вверх
MoLeX
Дата 7.2.2012, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: нет
Всего: 140



ayax2005, хотя бы для ответа AJAX.
Ответ такого вида уже не обработается
Код

{"status":false, "error":"", "content":"<br>9
text
     text
text"}


Добавлено через 1 минуту и 8 секунд
Ответ генерируется из шаблона, и его лучше писать понятным образом для редактирования
Код

<div id="mydiv">
    <span>span</span>
    <p>Text</p>
</div>


Добавлено через 3 минуты и 57 секунд
потом предпочитаю отдавать контент как можно сильнее ужатый - вырезаны лишние пробелы, переводы строк. Это позволяет отдавать контент немного быстрее


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 7.2.2012, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



MoLeX, При кодировании строки в Json, как символ "\n" должен переводится в последовательность символов '\n'. Так что - что-то неправильное с генерацией данных для Ajax - надо бы разобратся  smile.
К тому-же удалять служебные символы и пробелы из изображения строки может оказаться неправильно. Вдруг строка обязана содержать 5 пробелов?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 7.2.2012, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: нет
Всего: 140



Цитата(ksnk @  7.2.2012,  09:04 Найти цитируемый пост)
К тому-же удалять служебные символы и пробелы из изображения строки может оказаться неправильно. Вдруг строка обязана содержать 5 пробелов? 

служебные не нужны, а для пробела есть &nbsp;

Добавлено через 1 минуту и 9 секунд
Цитата(ksnk @  7.2.2012,  09:04 Найти цитируемый пост)
К тому-же удалять служебные символы и пробелы из изображения строки может оказаться неправильно. Вдруг строка обязана содержать 5 пробелов? 

служебные не нужны, а для пробела есть &nbsp;


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 7.2.2012, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Кстати, для выкидывания сдвоенных пробелов и пробельных символов лучше использовать такую регулярку
Код

$html = preg_replace("/\s\s+/", " ", $html);

P.S. i - не нужен...

Это сообщение отредактировал(а) ksnk - 7.2.2012, 09:31


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
krundetz
Дата 7.2.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

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



MoLeX, насчет прожорливости надо тестировать, вот вариант для сравнения вместо твоей первой
Код

$html = str_replace(array("\n", "\t", "\r"), " ", $html );

попробуй также вот эту, если я правильно помню то она тебе заменить обе твои
Код
$html = preg_replace("/\s+/i", " ", $html);

Цитата(ksnk @  7.2.2012,  09:30 Найти цитируемый пост)
/\s\s+/

зачем два раза спецсимвол указал?

Это сообщение отредактировал(а) krundetz - 7.2.2012, 13:31


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
ksnk
Дата 7.2.2012, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



krundetz, После такой замены правильный json
Код

{text:"<br>9
text
     text
text"}

превращается в неправильный
Код

{text:"<br>9texttexttext"}


Это сообщение отредактировал(а) ksnk - 7.2.2012, 13:20


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
krundetz
Дата 7.2.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

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



Цитата(ksnk @  7.2.2012,  13:19 Найти цитируемый пост)
превращается в неправильный

хм, счас проверю руками

Добавлено через 4 минуты и 31 секунду
протестировал, получил следующие
Код

{text:"<br>9 text text text"}


Добавлено через 7 минут и 5 секунд
сообразил ты про первый вариант, да там косяк сейчас поправлю, надо "" поменять на " "

Добавлено через 8 минут и 54 секунды
исправил


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
ksnk
Дата 7.2.2012, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Цитата(krundetz @  7.2.2012,  13:08 Найти цитируемый пост)
зачем два раза спецсимвол указал?

Если указать один - заменен будет каждый пробел. Если два - только нужная сдвоенная комбинация пробельных символов


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
krundetz
Дата 7.2.2012, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

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



Цитата(ksnk @  7.2.2012,  13:38 Найти цитируемый пост)
Если указать один - заменен будет каждый пробел. Если два - только нужная сдвоенная комбинация пробельных символов 

тогда, в тексте с одиночным вхождением символов "\n" "\t" замена тоже не произойдет


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
ksnk
Дата 7.2.2012, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Цитата(krundetz @  7.2.2012,  14:57 Найти цитируемый пост)
тогда, в тексте с одиночным вхождением символов "\n" "\t" замена тоже не произойдет 

Да. дествительно... Вот что значит - под Виндой сижу  smile У меня перевод строки - два символа...
Тогда так
Код

$html = preg_replace('/(?:\s\s+|[\n\r\t])/', " ", $html);

Хотя тут уже сложность регулярки может сожрать всю оптимальность замен  smile 
В общем - тестировать надо.

Это сообщение отредактировал(а) ksnk - 7.2.2012, 15:23


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
krundetz
Дата 8.2.2012, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

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



ksnk, а такая конструкция:
Код

\s+

разве не говорит что количество символов 1 или больше (то есть и 2)? А то что она заменяет пробел на пробел так ничего страшного. Цикл поиска всего с двумя условиями получается, а не с 7 как у тебя в последнем варианте. Что по идее должно работать быстрее. Хотя я за тест.

Кстати как тестировать будем?

Это сообщение отредактировал(а) krundetz - 8.2.2012, 00:23


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
ksnk
Дата 8.2.2012, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Цитата(krundetz @  8.2.2012,  00:22 Найти цитируемый пост)
Кстати как тестировать будем?

Моя проигрывает примерно в 1,5 раза. Можно не тестировать. Накладные расходы на сложность регулярки сильно больше накладных расходов на лишние реплейсы... Хотя мой первоначальный вариант немного выигрывает одинокому \s  smile 
Код


// so let's go generate

function mkt(){
    static $tm ; 
    $ttm = $tm ;$tm=microtime(true) ;
    return $tm-$ttm ;

// char per word 2-10
// word per line 5-7
// spaces between words 1-8

function genWord($len){
    static $charbase='abcdefghijklmnopqrstuvwxyz';
    $result='';
    for($i=0;$i<$len;$i++){
        $result.=$charbase[rand(0,strlen($charbase)-1)];
    }
    return $result;
}

function genLine($words){
    $result='';
    for($i=0;$i<$words-1;$i++){
        $result.=genWord(rand(2,10)).str_pad(' ',rand(1,8));
    }
    return $result.genWord(rand(2,10));
}

function genLines($lines){
    $result='';
    for($i=0;$i<$lines;$i++){
        $result.=genLine(rand(5,7))."\r\n";
    }
    return $result;
}

//echo genLines (4);

// so let's test it


foreach(array(4,40,4000) as $xxx){
    $test=genLines ($xxx);
    printf('strlen - %s ',strlen($test));
    mkt(); 
    $preg='/\s+/';
    for ($i=0;$i<10;$i++){
        preg_replace($preg,' ',$test,-1,$repl);
    }
    printf(' reg "%s" - step %f:2:3:3 (%d replacement)',htmlspecialchars($preg),mkt(),$repl);
    
    $preg='/(?:\s\s+|[\n\r\t])/';
    for ($i=0;$i<10;$i++){
        preg_replace($preg,' ',$test,-1,$repl);
    }
    printf(' reg "%s" - step %f:2:3:3 (%d replacement)',htmlspecialchars($preg),mkt(),$repl);
    
    $preg='/\s\s+/';
    for ($i=0;$i<10;$i++){
        preg_replace($preg,' ',$test,-1,$repl);
    }
    printf(' reg "%s" - step %f:2:3:3 (%d replacement)<br>',htmlspecialchars($preg),mkt(),$repl);
}


Добавлено @ 01:11
mkt - функция, вычисляющая время между вызовами mkt

Это сообщение отредактировал(а) ksnk - 8.2.2012, 01:19


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 8.2.2012, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



результат:
Цитата

strlen - 238
- reg "/\s+/" - step 0.000274:2:3:3 (23 replacement) 
- reg "/(?:\s\s+|[\n\r\t])/" - step 0.000331:2:3:3 (21 replacement) 
- reg "/\s\s+/" - step 0.000255:2:3:3 (21 replacement)

strlen - 2234
- reg "/\s+/" - step 0.001425:2:3:3 (230 replacement)
- reg "/(?:\s\s+|[\n\r\t])/" - step 0.001975:2:3:3 (204 replacement)
- reg "/\s\s+/" - step 0.001380:2:3:3 (204 replacement)

strlen - 242296
- reg "/\s+/" - step 0.154205:2:3:3 (24062 replacement)
- reg "/(?:\s\s+|[\n\r\t])/" - step 0.214269:2:3:3 (21493 replacement)
- reg "/\s\s+/" - step 0.152633:2:3:3 (21493 replacement)



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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