[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация регулярных выражений
silent_zzz
Есть у меня такая задача. Есть массив текстов, и надо исключить те тексты где находятся 4 и более цифр, а также между этими цифрами могут находится
- пробел
- тире
- тире с пробелами
- скобки
Я решил задачу таким образом
PHP
function number_del($arr){

    while (list(
$key$value) = each($arr)){    
    
preg_match('/(([0-9])(|[\s]|[\s]*\-[\s]*|[()]*)([0-9])(|[\s]|[\s]*\-[\s]*|[()]*)([0-9])(|[\s]|[\s]*\-[\s]*|[()]*)([0-9])(|[\s]|[\s]*\-[\s]*|[()]*)([0-9])*)/',
$value,$match);

        if (
$match){
            
            unset(
$arr[$key]);
        
        }
    }
    return 
$arr;
}


Больше ничего в голову не пришло...
Может еще как то можно составить регулярное выражение или же даже написать по другому функцию?



Спустя 46 минут, 29 секунд (9.03.2009 - 14:11) Alchemist написал(а):
а если цифры разделены буквами "ы" такой текст надо удалять ?

Спустя 9 минут, 26 секунд (9.03.2009 - 14:20) silent_zzz написал(а):
Alchemist, нет, только перечисленные символы.

Спустя 7 минут, 39 секунд (9.03.2009 - 14:28) twin написал(а):
На вскидку можно немного оптимальнее:

PHP
function number_del($arr){

    while (list(
$key$value) = each($arr))
if(
preg_match('/((\d)(|[\s]|[\s]*\-[\s]*|[()]*)(\d)(|[\s]|[\s]*\-[\s]*|[()]*)(\d)(|[\s]|[\s]*\-[\s]*|[()]*)(\d)(|[\s]|[\s]*\-[\s]*|[()]*)(\d)*)/',$value))
unset(
$arr[$key]);
    return 
$arr;
}
ну а если глубже, то не хватает исходных условий. Какие тексты, что там может быть, что сохранить и что убрать...

Спустя 11 минут, 35 секунд (9.03.2009 - 14:39) Alchemist написал(а):
ну если только перечисленные символы, то я бы сделал так:
Код
/[\d][)( -]+[\d][)( -]+[\d][)( -]+[\d]/

Спустя 14 минут, 2 секунды (9.03.2009 - 14:53) silent_zzz написал(а):
Alchemist, не работает... к примеру зачем после [)( -] плюс? Ведь символ может быть а может и не быть, да еще и пробелы тоже могут быть несколько но замена [0-9] на [\d] не много сократит регулярку так, что сенкс. wink.gif

Спустя 1 минута, 42 секунды (9.03.2009 - 14:55) Alchemist написал(а):
ты прав... замени все плюсы на звездочки и попробуй еще раз

Спустя 44 секунды (9.03.2009 - 14:56) silent_zzz написал(а):
twin, тексты обычные как правило предложения, а сохранять ничего не надо, просто удалить из массива те тексты в которых найдены больше 4 цифр)

Спустя 10 минут, 14 секунд (9.03.2009 - 15:06) silent_zzz написал(а):
Alchemist, твоя чудо регулярка теперь работает и причем так как надо! Зачот!
Особенно удивило как в моем случае
PHP
[s]*-[s]*|[()]*

заменяется у тебя всего лишь
PHP
[)( -]

Это пять! smile.gif
И еще остался такой вопрос как видно в моей регулярке перечисления циферок [0-9] у меня их пять если поставить 4 то тексты где встречается именно 4 цифры не находятся, а в твоем случае их четыре и все работает?

Спустя 4 минуты, 58 секунд (9.03.2009 - 15:11) Alchemist написал(а):
Если честно, я твою регулярку не разбирал и не буду (уж прости)...

Спустя 13 минут, 37 секунд (9.03.2009 - 15:24) twin написал(а):
Ну я так толком условия и не понял, вот универсальное решение, только за скорость не ручаюсь, если текста очень много.
PHP
function number_del($arr){

    while (list(
$key$value) = each($arr))
    {
preg_match_all('/\d/',$value,$out);
if(
count($out[0]) >= 4)
unset(
$arr[$key]);
    }
return 
$arr;
}

Спустя 10 минут, 20 секунд (9.03.2009 - 15:35) silent_zzz написал(а):
twin, прикольно, только как с символами?

Спустя 5 минут, 34 секунды (9.03.2009 - 15:40) twin написал(а):
Какими символами? Тут не важно вообще, есть ли они или нету. Если циферь 4 или больше - апстену запись.

Спустя 7 минут, 44 секунды (9.03.2009 - 15:48) silent_zzz написал(а):
а ну да я понял, просто надо учитывать только те символы которые в теме)

Спустя 9 минут, 19 секунд (9.03.2009 - 15:57) twin написал(а):
Вот и не понятны условия. То есть такая запись допустима: 1,2,3,4?

Спустя 8 минут, 34 секунды (9.03.2009 - 16:06) silent_zzz написал(а):
twin, ну недопустима любая запись которая состоит из более 4 цифр, и причем цифры могут быть разделены - пробелом, тире, тире с пробелами, скобками.
То есть запись 7654 недопустима
6-4 - 5()4 так же недопустима

Спустя 7 минут, 20 секунд (9.03.2009 - 16:13) waldicom написал(а):
Цитата
ну недопустима любая запись которая состоит из более 4 цифр, и причем цифры могут быть разделены - пробелом, тире, тире с пробелами, скобками.

противоречит
Цитата
То есть запись 7654 недопустима


Спустя 10 минут, 8 секунд (9.03.2009 - 16:23) twin написал(а):
Нет, надо учиться четче ставить задачу. А вот такая запись допустима?
12abc(34) 5? Или записи только из цифр?

Спустя 1 минута, 46 секунд (9.03.2009 - 16:25) silent_zzz написал(а):
waldicom, точнее от 4 символов, то есть есть четыре цифры в тексте запись надо удалять.

Спустя 1 минута, 54 секунды (9.03.2009 - 16:27) silent_zzz написал(а):
twin, ну я не знаю я про буквы же не говорил. Сказал что только перечисленные символы ну и получается что твоя запись допустима и ее трогать не надо.

Спустя 1 час, 19 минут, 27 секунд (9.03.2009 - 17:47) twin написал(а):
Так?
PHP
function number_del($arr){

    foreach ($arr as $key => $value)
if(
preg_match('/[\d\s\-\(\)]{4,}/',$value))
unset(
$arr[$key]);
return $arr;
}

PS Про скобки забыл, поправил. Только убъёт 4 пробела 4 скобки или 4 дефиса тоже. Ты бы тестовый текст лучше дал.

Спустя 3 часа, 30 минут, 4 секунды (9.03.2009 - 21:17) silent_zzz написал(а):
так я пробовал, не получается)
ну тестовый текст собственно
1234
12345
123456
1-2-3-4
1 - 2 - 3 - 4
1(234)

Спустя 2 часа, 19 минут, 16 секунд (9.03.2009 - 23:36) twin написал(а):
В каком месте не получается то?

PHP
$arr = array(
"12345",
"123456",
"1-2-3-4",
"1 - 2 - 3 - 4",
"1(234)",
"aaa",
"1234",
"1234aaaa",
"123",
"123aaa",
"123aaa",
"1 234",
"1 23 4",
"1-234",
"1- 234",
"1-23-4",
"1- 23- 4",
"1 234aaa",
"1 23 (4)aaa",
"1-23aaa",
"1- 234aaa",
"1-23-4aaa6666",
"1- 23- 4aaa"
);
function 
number_del($arr){

    foreach (
$arr as $key => $value)
if(
preg_match('/[\d\s\-\(\)]{4,}/',$value))
unset(
$arr[$key]);
return 
$arr;
}
print_r(number_del($arr));

Спустя 46 минут, 12 секунд (10.03.2009 - 00:22) Joker написал(а):
PHP
'/[\d\s\-\(\)]{4,}/'
Поскольку я учу регулярки) буду, разбирать что в этой написано) Если не правильно поправте) \d\s этим сказано что могуть быть табуляторы цифры перенос строки и проблем -\ а это чот такое??? () это запоминает \ зачем запоминать слеш? {4,} это значит что минимум четыре раза это должно идти подряд.

Спустя 3 минуты, 14 секунд (10.03.2009 - 00:25) Alchemist написал(а):
Цитата (twin)
В каком месте не получается то?

вот в этом:
PHP
"1-23aaa",

Спустя 4 минуты, 43 секунды (10.03.2009 - 00:30) Joker написал(а):
тут только 3 цифры а реч шла о минимум четырех. Ну насколько я понел)

Спустя 47 секунд (10.03.2009 - 00:31) Alchemist написал(а):
о том и речь

Спустя 8 минут, 18 секунд (10.03.2009 - 00:39) Joker написал(а):
Дак не срабатывает потомучто три цифры...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.