Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Опять регулярки


Автор: TwiSteR 14.2.2006, 10:39
Приветствую вновь уважаемые !

Задача такая, сделать подобие пхп функции addslashes()

Вот её описалово
=========================================================
string addslashes ( string str)


Возвращает сроку str, в которой перед каждым спецсимволом добавлен обратный слэш (\), например для последующего использования этой строки в запросе к базе данных. Экранируются одиночная кавычка ('), дойная кавычка ("), обратный слэш (\) и NUL (байт NULL).

Функция addslashes() часто применяется при записи в базу данных. Предположим, если нужно внести в базу данных имя O'reilly, то символ ' должен быть экранирован. В большинстве баз данных для этого используется \, строка будет выглядеть как O\'reilly. Заметьте, что сам символ \ в базу данных записан не будет. Если директива конфигурации magic_quotes_sybase имеет значение on, то символ ' будет экранироваться добавлением еще одного ' вместо \.

=========================================================

Пробую так

Код

sub addslashes {

    my $entry = @_[0];
    $entry =~ s/[\'\"]/\\'/gis;
    return $entry;

}

Но это не совсем правильно до конца ибо если есть " должно заменяться на \" а заменяется на \'

Подскажите плиз...

Автор: nitr 14.2.2006, 10:53
А для чего тебе?
Если что смотри ман "\Q", пример, $str =~ /\Q$переменная\E/;
"\Q" сама добавляет "\" перед спец. символами, дабы не было ошибки.
Или для тебя самое простое:
Код

sub addslashes {
    my $entry = @_[0];
    $entry =~ s/'/\\'/gis;
    $entry =~ s/"/\\"/gis;
    return $entry;
}


А у тебя, думаю, ошибка: замени [\'\"] на ['"], это даж в твоём коде не могло работать.

Автор: TwiSteR 14.2.2006, 11:19
nitr,

Сенкс сделал так

Код

sub addslashes {

    my $entry = @_[0];
    $entry =~ s/'/\\'/gis;
    $entry =~ s/"/\\"/gis;
    return $entry;

}

но вот так не пашет
Код

sub addslashes {

    my $entry = @_[0];
    $entry =~ /\Q$entry\E/;
    return $entry;

}


Автор: sharq 14.2.2006, 11:21
TwiSteR,
Код

sub addslashes {
    my $entry = shift;
    $entry =~ 
        s{
            (
                [ \s ' " \0 ]
            )
        }{
            "\\".$1
        }smegx;
    return $entry;
}
print addslashes(q~hello'dd "sd" s~);


smile
Добавлено @ 11:23
Можешь для экранирования запроса к БД использовать метод DBI quote.


Автор: BlackLFL 14.2.2006, 12:04
Код

my $var = "O'reilly";

my $rv = $dbh->do("INSERT INTO table_name ( row_name ) VALUES(". $dbh->quote( $var ) ) or die DBI->errstr;

Автор: nitr 14.2.2006, 12:42
sharq,
прикольный код smile , лишь бы человек не запутался ;)
TwiSteR,
используй его код, он практичен. Вот модификация.. если не понятны "расширенные" регулярки:
Код

sub addslashes {
    my $entry = shift;
    $entry =~ s/([ '"\0])/"\\".$1/gise;
    return $entry;
}

Да и \Q здесь не причём... smile Извини, ошибочно запутал...
Добавлено @ 12:43
Кстати, форум использует регулярки... =)) Лучше б как в xml SAX использовалось, но конечно проще как щас smile
Я просто к слову ;)

Автор: sharq 14.2.2006, 14:31
nitr,
Цитата(nitr @ 14.2.2006, 13:42 Найти цитируемый пост)
$entry =~ s/([ '"\0])/"\\".$1/gise;

ключ i - здесь нен нужен. smile
а m - лучше оставить.

smile

Автор: nitr 14.2.2006, 17:04
=) канечна не нужен... применение m лучше расскажи в этом примере.

Автор: TwiSteR 14.2.2006, 23:32
Всём огромное спасибо !

Автор: sharq 16.2.2006, 17:50
nitr,
Цитата(nitr @ 14.2.2006, 18:04 Найти цитируемый пост)
применение m лучше расскажи в этом примере.

этот ключик сочитается вместе с ключиком s.
смотри документацию по re. smile

smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)