Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> регулярные выражения 
:(
    Опции темы
Гость_Андрей
  Дата 5.7.2005, 07:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите при помощи каких регулярных выражений можно сотворить следующее

имеем некий html текст в нем имеется строка:
........<div class=type><b>Relib</b><a name="Relib">..........->
->..........</table></td><td></td></tr>.......................

каким выражением мне их вырезать в пределах
от:
<div class=type><b>Relib</b><a name="Relib">
до:
</table></td><td></td></tr>

Заранее Спасибо за подсказочки
  Вверх
chaos
Дата 5.7.2005, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



сдесь наверное лутше воспользоваться index
Добавлено @ 07:55
или каким-нибудь HTML paresr'ом
PM WWW   Вверх
Burdin
Дата 5.7.2005, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



непонял!!!!
если можно то поподробней
PM MAIL WWW ICQ   Вверх
korob2001
Дата 5.7.2005, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



А я не понял, что именно нужно вырезать???


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Burdin
Дата 5.7.2005, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



имеем html файл в нем надо вырезать ту информацию которая находится в промежутке от:
<div class=type><b>Relib</b><a name="Relib"> до: </table></td><td></td></tr>
и содержимое которое находится между этими данными нужно сохранить и работать с ними дальше

PM MAIL WWW ICQ   Вверх
korob2001
Дата 5.7.2005, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Вообще-то было бы не плохо знать, что мы ищем, текст, цифры и т.п. Вот такой вариант попробуй:
Код

#!/usr/bin/perl -w
use strict;
my $str = '<div class=type><b>Relib</b><a name="Relib">Результат1</table></td><td></td></tr><table>
           <div class=type><b>Relib</b><a name="Relib">Результат2</table></td><td></td></tr>';
my @res = ();
$str =~ s/<div class\=type><b>Relib<\/b><a name=\"Relib\">(.*?)<\/table><\/td><td><\/td><\/tr>/push(@res, $1)/egi;
print join("\n", @res);

В результате массив @res, будет иметь все подстроки, которые находятся между теми тегами, которые ты указал.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Usya
Дата 5.7.2005, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Кстати, посмотри еще
http://www.webcode.ru/re/table/
Думаю, что пригодится smile
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Burdin
Дата 6.7.2005, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пасиба!!! smile
PM MAIL WWW ICQ   Вверх
SantaXP
Дата 7.7.2005, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Разу уж тема так называется, то не стал создавать отдельную тему. smile
----
Мне крайне нужно создать проверку переменных ($nick, $password, $repeat_password, $email) на наличие лишь знаков a-zA-z и 0-9 (в случае с $email + @) при скрипте регистрации посетителя, но поскольку я в регулрных выражениях вечно путаюсь, то ничего толкового сделать не могу. smile Не мог ли бы вы мне помочь???
PM MAIL   Вверх
Burdin
Дата 7.7.2005, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код
if ($form_email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ || $form_email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/) {
$retyrn="Email неверный!!!";
}

$field =~ /[^a-zA-Z0-9_-]/
#проверяет на наличиие латинского алфавита, цифр и знаков `_' и `-'


Добавлено @ 01:04
Код

# А эти символы лучше вырезать
$post{$field} =~ S/[\&;\`'\\\|"*?~<>^\(\)\[\]\{\}\$\n\r\0]///ig;

PM MAIL WWW ICQ   Вверх
korob2001
Дата 7.7.2005, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Зачем так много скобок? Ты же не используешь эти переменные.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Usya
Дата 7.7.2005, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Кстати, можно и топорным способом через временную переменную (чтоб не портить первоначальную):
Код

$e=~tr/a-zA-Z0-9/k/s;

Результат либо "k" (для простой переменной), либо "[email protected]" или "[email protected]" для мыла...
Должно сработать
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
sharq
Дата 7.7.2005, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

Репутация: 2
Всего: 28



SantaXP вот собственно:
Код

           $value = trim($value);
           $value = unHTML($value);

        # проверка поля на пустоту
        if (!$value && $req) {
            $comm = 2;
            $check_errors = 1;
        }
        # если поле заполнено
        if ($value) {
            # определение типа проверки
            if (($name eq 'login') or ($name eq 'pass') or ($name eq 'pass2')) {
                $flag = 1;
            } elsif ($f->{name} eq 'email') {
                $flag = 2;
            } else {
                $flag = undef;
            }
            # проверка поля на наличие определенных символов
            if (check_symbol($value, $flag)) {
                $comm = 3;
                $check_errors = 1;
            }
            # проверка первого символа
            if (check_first_symbol($value, $flag)) {
                $comm = 4;
                $check_errors = 1;
            }
            # проверка длины слова
            if (!check_word($value, $max)) {
                $comm = (!$max) ? 5 : 6;
                $check_errors = 1;
            }
            # проверка уникальности логина
            if ($name eq 'login') {
                if (get_item($dbh, $value, 'login', 'regestry') or
                    get_item($dbh, $value, 'login', 'temp_regestry') ) {
                    $comm = 1;
                    $check_errors  = 1;
                }
            }
            # сравнение двух паролей
            $pass = $value if $name eq 'pass';
            if ($name eq 'pass2') {
                if (!Tools::check_compare($pass, $value)) {
                    $comm = 1;    
                    $check_errors  = 1;
                }
            }
            # проверка электронного адреса: пользователь@имя.хоста
            if ($name eq 'email') {
                if (!check_email($value)) {
                    $comm = 1;
                    $check_errors = 1;
                }
            }
        } # конец всех проверок



Здесь $req - флаг, определяющий, что поле является необходимым для отображения,
$comm = номер сообщения об ошибке, $check_errors - флаг, определяющий наличие ошибок.
$name - название поля, $value - значение поля.

Функция get_item - выбирает записи из БД.

Вот функции:
Код

# функция удаления лишних пробелов в начале и в конце
sub trim($) {

    my $str = shift;
    $str =~ s/^\s+//; # удаление пробелов в начале слова
    $str =~ s/\s+$//; # удаление пробелов в конце слова
    return $str;
}

# замена html
sub unHTML($) {

    my $text = shift;
    # экранирование html
    my %ENT=('<'=>'lt','>'=>'gt','"'=>'quot');
    $text =~ s!([<>"])!&$ENT{$1};!g;
    $text =~ s|\&lt;!--|<!--|g;
    $text =~ s|--\&gt;|-->|g;
    # обработка \n, \r, \s
    $text =~ s|\n|[br]|g;
    $text =~ s|\r||g;
    $text =~ s|\s+| |g;
    # экранирование стоп-символов
    $text =~ s|\@|{et}|g;
    $text =~ s!\|!|!g;
    $text =~ s|\{|{|g;
    $text =~ s|\}|}|g;
    $text =~ s|\(|(|g;
    $text =~ s|\)|)|g;
    $text =~ s|\[|]|g;
    $text =~ s|\[|]|g;
    $text =~ s|\.|.|g;
    $text =~ s|\,|,|g;
    $text =~ s|\~|~|g;
    $text =~ s|'|'|g;
    $text =~ s|\?|?|g;
    $text =~ s|\+|+|g;
    $text =~ s|\#|#|g;

    $text =~ s|^\$+$|& # 3 6 \;|g;
    $text =~ s|\$|& # 3 6 \;|g;
    $text =~ s|\&|& # 3 8 \;|g;
    $text =~ s|\*|& # 8 7 2 7 \;|g;
    $text =~ s|\^|& # 7 1 0 \;|g;


    return $text;
}
# функция проверки наличия определенных символов
sub check_symbol($$) {

    my ($str, $flag) = @_;
    if ($flag == 1) {
        return ( $str =~ /[^A-Za-z0-9_]/ ); # проверка слов типа login
    }
    elsif ($flag == 2) {
        return ( $str =~ /[^A-Za-z0-9\@_\.\-]/ ); # проверка слов типа email
    }
    else {
        return ( $str =~ /[^A-Za-zА-Яа-я0-9_\.\-\s]/ ); # проверка любых слов
    }
}
# функция проверки первого символа
sub check_first_symbol($$) {

    my ($str, $flag) = @_;
    ($flag) ? return ( substr($str, 0, 1) =~ /_|\.|\-/ ) # проверка "_", ".", "-"
               : return ( substr($str, 0, 1) =~ /[^A-Za-zА-Яа-я]/ ); # проверка "не буква"
}
# функция проверки длины слова
sub check_word($$) {

    my ($str, $flag) = @_;
    my $str_length = length($str);
    my $max_length = (!$flag) ? $word_max_size : $word_max2_size;
    return ( ($str_length >= $word_min_size)and($str_length <= $max_length) );
}
# функция, которая сравнивает два значения
sub check_compare($$) {

    my ($value1, $value2) = @_;
    return ( $value1 eq $value2 );
}

# функция проверки электронного адреса: пользователь@имя.хоста
sub check_email($) {

    my $str = shift;
    return ( $str =~ /^[a-zA-Z_\.\-\d]+\@[a-zA-Z\.\-\d]+\.[a-zA-Z]{2,4}$/ );
}


smile

Это сообщение отредактировал(а) sharq - 7.7.2005, 19:01


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
SantaXP
Дата 7.7.2005, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Burdin
Спасибо. Пример с e-mail работает, а вот выражение с проверкой на различные символы, которые нужно вырезать написано неправильно, ибо выдаёт у меня ошибку. smile
----------
sharq
Спасибо огромное за проделанную вами работу, но вычленяя из написанного вами нужное мне я немного запутался. Ибо мне надо лишь выражение, чтобы в логине и пароле кроме a-zA-Z0-9_ ничего не было, а когда я пишу:
Код

#это только проверка $nick (он же логин)
if (($nick =~ /^[a-zA-Z0-9_]/)
{print qq(
<td align="center" width=67%>
All in normal!
</td>);}
else
{print qq(
<td align="center" width=67%>
Go fuck yourself!
</td>);}

то он лишь проверяет, чтобы один из знаков написаееых выше попадался ему на глазе, а мне надо, чтобы там были только эти знаки, а вот как это сделать понять пока не могу... smile
PM MAIL   Вверх
sharq
Дата 8.7.2005, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

Репутация: 2
Всего: 28



SantaXP сравни две строки
Цитата(sharq @ 7.7.2005, 18:43)
$str =~ /[^A-Za-z0-9_]/


Цитата(SantaXP @ 7.7.2005, 23:48)
$nick =~ /^[a-zA-Z0-9_]


Видишь разницу - она большая!!!

Твой случай проверяет, чтобы логин начинался с символа приведенного множества...

Почитай основы регулярных выражений, например, в книге Изучаем Perl/

Реально, ничего сложного там нет. smile

Это сообщение отредактировал(а) sharq - 8.7.2005, 00:13


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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