За последние 24 часа нас посетили 19024 программиста и 1616 роботов. Сейчас ищут 683 программиста ...

перевод в нижний регистр

Тема в разделе "Регулярные выражения", создана пользователем overdoze, 30 сен 2010.

  1. overdoze

    overdoze Активный пользователь

    С нами с:
    9 мар 2010
    Сообщения:
    4
    Симпатии:
    0
    Доброго времени!
    Такая задача. Есть база данных в ней нужно изменить названия таблиц, полей и прочего таким образом: все заглавные буквы перевести в нижний регистр и расставить "_" перед ними.
    К примеру,
    mainUserId=main_user_id
    sysInterfaceSetup=sys_interface_setup
    Сделал дамп базы, получился текстовый файлик на 16000 строк. Ручками через редактор колбасить ну очень долго.
    Пример дампа:
    Код (Text):
    1.  
    2. --
    3. -- Name: mailAliass_view; Type: VIEW; Schema: public; Owner: pgsql
    4. --
    5.  
    6. CREATE VIEW "mailAliass_view" AS
    7.     SELECT "mailAliass"."mailAlias" AS alias, ((("main_users"."login")::text || '@'::text) || ("main_domains"."main_domain")::text) AS mail FROM "main_users", "mailAliass", "main_domains" WHERE (("main_domains"."main_domain_id" = "mailAliass"."main_domain_id") AND ("mailAliass"."main_user_id" = "main_users"."main_user_id"));
    8.  
    9.  
    10. ALTER TABLE public."mailAliass_view" OWNER TO pgsql;
    11.  
    12. --
    13. -- Name: mailDovecotConfigDefaults; Type: TABLE; Schema: public; Owner: pgsql; Tablespace:
    14. --
    15.  
    16. CREATE TABLE "mailDovecotConfigDefaults" (
    17.     "mailDovecotConfigDefaultId" bigint NOT NULL,
    18.     "ConfigChunk" text NOT NULL,
    19.     "mailDovecotConfigDefault" character varying(255) DEFAULT NULL::character varying NOT NULL,
    20.     "Position" bigint NOT NULL
    21. );
    22.  
    23.  
    24. ALTER TABLE public."mailDovecotConfigDefaults" OWNER TO pgsql;
    25.  
    26. --
    27. -- Name: mailDovecotConfig_view; Type: VIEW; Schema: public; Owner: pgsql
    28. --
    29.  
    30. CREATE VIEW "mailDovecotConfig_view" AS
    31.     SELECT "mailDovecotConfigDefaults"."Position", "mailDovecotConfigDefaults"."ConfigChunk" AS "config_string" FROM "mailDovecotConfigDefaults" ORDER BY "mailDovecotConfigDefaults"."Position";
    32.  
    33.  
    34. ALTER TABLE public."mailDovecotConfig_view" OWNER TO pgsql;
    35.  
    36. --
    37. -- Name: mailEximConfigDefaults; Type: TABLE; Schema: public; Owner: pgsql; Tablespace:
    38. --
    39.  
    40. CREATE TABLE "mailEximConfigDefaults" (
    41.     "mailConfigDefaultId" bigint NOT NULL,
    42.     "ConfigChunk" text NOT NULL,
    43.     "mailConfigDefault" character varying(255) DEFAULT NULL::character varying NOT NULL,
    44.     "Position" bigint NOT NULL
    45. );
    Видно, что каждое название будь то название таблицы или поля или функции, или последовательности... заключены в кавычки. Получается нужно найти в тексте слова заключенные в двойные кавычки и затем их изменить как надо.

    попытался, что то придумать с использованием preg_replace_callback:
    Код (Text):
    1.  
    2. $result = preg_replace_callback('~(")([^<]+)(")~i', 'my_replace_callback', $text);
    до функции дело не дошло, так как в неё передается все что идет от первой кавычки текста до последней.
    У кого есть идеи откликнитесь, регулярные выражения сводят меня с ума
     
  2. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Регулярные выражения всех сводят с ума. :)

    /"(.*?)"/is - должно сработать. Можно ещё с ключом U попробовать. Но уверен, с s нормально будет.
     
  3. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    PHP:
    1. <?
    2. function get_all_table_names ()
    3. {
    4.     // считать список таблиц из базы и вернуть в массиве...
    5.     return array ('mailDovecotConfigDefaults', 'mailDovecotConfig_view', 'mailEximConfigDefaults');
    6. }
    7.  
    8. foreach (get_all_table_names () as $table_name)
    9. {
    10.     $new_table_name = preg_replace ('/([A-Z])/e', "'_'.strtolower('\\1')", $table_name);
    11.     echo "ALTER TABLE $table_name RENAME TO $new_table_name;\n";
    12. }
    13. ?>