генерация строк по регулярному выражению

Тема в разделе "PHP", создана пользователем Mapkyc, 12 янв 2011.

Модераторы: latteo
  1. Mapkyc

    Mapkyc Постоялец

    Регистр.:
    8 май 2007
    Сообщения:
    106
    Симпатии:
    47
    Вообщем хочу забить в базу все возможные четырехсимвольные домены состоящие из букв и цифр..т.е.

    "#[a-z0-9]{4}\.ru#"

    как перебрать все возможные комбинации , чтобы сформировать массив или добавить такую строку в БД
     
  2. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    напр, через вложенный foreach, 1,6 M вариантов

    PHP:
    ini_set('memory_limit',"200M");
    $arr array_merge(range('a','z'),range(0,9));

    foreach(
    $arr as $v1)
        foreach(
    $arr as $v2)
          foreach(
    $arr as $v3)
             foreach(
    $arr as $v4)
                
    $res_arr[]=$v1.$v2.$v3.$v4;


    file_put_contents('res.txt',join(".ru\n",$res_arr).'.ru');
     
  3. Mapkyc

    Mapkyc Постоялец

    Регистр.:
    8 май 2007
    Сообщения:
    106
    Симпатии:
    47
    про функцию range я не знал...спасибо=)

    вот как бы теперь все это в мускульную таблицу запихать в один подход..
     
  4. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    за один подход лучше не стоит
    слишком большой объем данных.
    где-то читал, что лучше всего по скорости добавлять за раз примерно по 1000 строк
    о есть лучше всего вставлять в базу данные в конце каждой итерации второго цикла
    внутри него еще два цикла, что дает 1296 строк за раз
     
  5. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    много запросов получится, оптимальнее импорт из файла

    Код:
    LOAD DATA LOCAL INFILE '/home/user/public_html/res.txt'
    INTO TABLE table_name
    LINES TERMINATED BY '\n'
    (field_name);
     
    latteo нравится это.
  6. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    ещё вариант всё сделать в mysql, нужны две таблицы, первая алфавит с символами для комбинаций:
    Код:
    CREATE TABLE IF NOT EXISTS `alphabet` (
      `alpha` varchar(1) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    INSERT INTO `alphabet` (`alpha`) VALUES
    ('a'), ('b'), ('c'), ('d'), ('e'), ('f'), ('g'), ('h'), ('i'), ('j'), ('k'), ('l'), ('m'), ('n'), ('o'), ('p'), ('q'), ('r'), ('s'), ('t'), ('u'), ('v'), ('w'), ('x'), ('y'), ('z'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('0');
    
    А вторая таблица domain:
    Код:
    CREATE TABLE IF NOT EXISTS `domain` (
      `domain` varchar(10) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    в которую надо записать комбинации.

    А комбинации генерируются запросом:
    Код:
    INSERT INTO domain (
        SELECT CONCAT(t1.alpha, t2.alpha, t3.alpha, t4.alpha, '.ru') domain
        FROM alphabet t1, alphabet t2, alphabet t3, alphabet t4
    );
    
    пример запроса для числовых доменов
    Код:
    SELECT domain
    FROM domain
    WHERE domain REGEXP '[0-9]{4}\.ru'
    
    или например сгенерировать по регулярке из таблицы с алфавитом только числовые домены
    Код:
    SELECT CONCAT(t1.alpha, t2.alpha, t3.alpha, t4.alpha, '.ru') domain
    FROM alphabet t1, alphabet t2, alphabet t3, alphabet t4
    WHERE CONCAT(t1.alpha, t2.alpha, t3.alpha, t4.alpha, '.ru') REGEXP '[0-9]{4}\.ru'
    
     
    latteo нравится это.