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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возможен ли поиск без регулярок 
V
    Опции темы
Silent_s
Дата 7.3.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



К примеру мне надо найти слова в тесте где встречаются слова в верхнем регистре с помощью регулярок сделать это не трудно получится примерно так ([A-ZА-Я]+)
А вот как реализовать подобное с помощью обычных функций для работы со строками. 
--------------------
Мой блог
PM MAIL   Вверх
enof
Дата 7.3.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 30
Всего: 35



Можно в цикле проверять каждый символ на регистр smile 
PM MAIL ICQ Skype   Вверх
Silent_s
Дата 7.3.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А так быстрее будет при поиске по тексту чем регуляркой?
--------------------
Мой блог
PM MAIL   Вверх
quarz
Дата 7.3.2009, 17:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Обычная штука: регулярками можно сделать что угодно и это будет смотреться красиво и аккуратно. Но работать будет медленно, по сравнению с собственной функцией, реализующей конкретную задачу.
Так что для простых выражений, там где требуется высокая скорость работы эффективнее сделать проход по строке циклом с необходимыми проверками.
Для уверенности можно прогнать в цикле 100 раз регулярку, а потом 100 раз свою функцию поиска и сравнить время.
PM MAIL   Вверх
enof
Дата 7.3.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 30
Всего: 35



quarz, неужели?
Код

<?php
header("Content-Type: text/html; charset=windows-1251");
error_reporting(~E_ALL);

function testChar($char)
{
    $char = ord($char);
    if(($char >= 192 && $char <= 223) || ($char >=65  && $char <= 90))
        return 'up';
    elseif(($char >= 224 && $char <=255) || ($char >= 97 && $char <= 122))
        return 'low';
    else
        return 'not_letter';
}
function getUpWord($str)
{
    $tmp = array();
    $i = 0;
    $array_char = str_split($str);
    foreach($array_char as $k=>$v)
    {
        if(testChar($v) == 'up' && testChar($array_char[$k-1]) != 'low')
            $tmp[$i] .= $v;
        elseif(testChar($v) == 'low')
            unset($tmp[$i++]);
        else
            $i++;
    }
    $end_arr = array();
    foreach($tmp as $v)
        $end_arr[] = $v;
    return $end_arr;

}
function getUpWordWithRegExp($str)
{
    preg_match_all("#(?<![a-zа-я])([А-ЯA-Z]+)(?![a-zа-я])#",$str,$arr_matches);
    return($arr_matches[1]);
}

$str = "Маленкое слово за которым ИдеТ БОЛЬШОЕ слово ЕЩЕ большое МАЛЕНЬКОЕ ВИНГРАД форум ВСЯКИЙ бред в СТРОКЕ VINGRAD big WorD";

$start_time = microtime(1);
for($i = 0; $i<10000; $i++)
   $array = getUpWord($str);
$end_time = microtime(1);
$time = $end_time - $start_time;
echo "Время выполнения функции без регулярных выражений: $time секунд.<br>";

$start_time = microtime(1);
for($i = 0; $i<10000; $i++)
   $array = getUpWordWithRegExp($str);
$end_time = microtime(1);
$time = $end_time - $start_time;
echo "Время выполнения функции с регулярными выражениями: $time секунд.<br>";
?>

Код

Время выполнения функции без регулярных выражений : 6.29158520699 секунд.
Время выполнения функции с регулярными выражениями: 0.262855052948 секунд.

надо сначала с задачей разобраться и примерно оценить, как быстро ваш велосипед будет работать.
В данном случае регулярки предпочтительнее по скорости.
Или для вас это:
Код

function testChar($char)
{
    $char = ord($char);
    if(($char >= 192 && $char <= 223) || ($char >=65  && $char <= 90))
        return 'up';
    elseif(($char >= 224 && $char <=255) || ($char >= 97 && $char <= 122))
        return 'low';
    else
        return 'not_letter';
}
function getUpWord($str)
{
    $tmp = array();
    $i = 0;
    $array_char = str_split($str);
    foreach($array_char as $k=>$v)
    {
        if(testChar($v) == 'up' && testChar($array_char[$k-1]) != 'low')
            $tmp[$i] .= $v;
        elseif(testChar($v) == 'low')
            unset($tmp[$i++]);
        else
            $i++;
    }
    $end_arr = array();
    foreach($tmp as $v)
        $end_arr[] = $v;
    return $end_arr;
}

написать удобнее этого:
Код

preg_match_all("#(?<![a-zа-я])([А-ЯA-Z]+)(?![a-zа-я])#",$str,$arr_matches);

?

Это сообщение отредактировал(а) enof - 7.3.2009, 18:47
PM MAIL ICQ Skype   Вверх
Silent_s
Дата 7.3.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



о круто, биг сенкс enof
--------------------
Мой блог
PM MAIL   Вверх
Silent_s
Дата 8.3.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

preg_replace('/([A-ZА-ЯЁ]{2,})/','',$text);

и если ищем по массиву с такими данными
Код

$text = array(
1=> "АБВ",
2=> "Привет",
3=> "ПРивет");

то он выдаст такое - "Привет ивет"
А надо чтобы ивет не выводил..
--------------------
Мой блог
PM MAIL   Вверх
enof
Дата 8.3.2009, 14:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 30
Всего: 35



Код

preg_replace('#([A-Z]{2,}[a-z]*)#','',array('ABC','Hello','HEllo'));

PM MAIL ICQ Skype   Вверх
Silent_s
Дата 8.3.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



enof, спасибо! А я думал несколько в ином направлении считал, что можно вставить что то во второй параметр preg_replace или поставить какой нить хитрый модификатор smile 
--------------------
Мой блог
PM MAIL   Вверх
skyboy
Дата 8.3.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

Репутация: 75
Всего: 260



Цитата(quarz @  7.3.2009,  16:30 Найти цитируемый пост)
Но работать будет медленно, по сравнению с собственной функцией, реализующей конкретную задачу.

регулярное выражение компилируется в конечный автомат. который работает на скорости, сравнимой со скоростью "велосипедов". и самое большое время занимает как раз компиляция, а не выполнение. потому если необходимо одного и тоже регвыр использовать на разные данные, стоит попробовать модификатор S
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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