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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с регулярками, from php 
V
    Опции темы
TwiSteR
Дата 7.2.2006, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кибер красавчег
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 15.6.2005
Где: World->Russia

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



Приветствую уважаемые !
Есть функция на пхп с кучей регулярок
Код

function clean_words($entry) {  

        $entry = " ".strip_tags($entry)." ";

        $entry = preg_replace("#\[(mm|gm|mod|ex|mergetime)\](.+?)\[/\\1\]#is",  "", $entry);

        // Replace line endings by a space
        $entry = preg_replace("/[\n\r]/is", " ", $entry); 

        // Quickly remove BBcode.
        $entry = preg_replace("/\[\/?[a-zA-Z*]+[^\]]*\]/", " ", $entry);
        $entry = preg_replace("#(^|\s)((http|https|news|ftp)://\w+[^\s\[\]]+)#is", " ", $entry);

        // HTML entities like  
        $entry = preg_replace("/\b&[a-z]+;\b/", " ", $entry); 

//      $entry = preg_replace("/(\:spy\:|\:cool|\:mod|\:lamer)/", "", $entry);

        // Filter out strange characters like ^, $, &, change "it's" to "its"
        $entry = str_replace($this->drop_char_match, $this->drop_char_replace, $entry);

        return $entry;

        }


в регулярках вообщем не бум-бум.
--------------------
PM MAIL WWW ICQ   Вверх
korob2001
Дата 7.2.2006, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Что-то я вопроса не заметил. smile Что именно не понятно? И почему в раздел PHP не запостил?


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


Кибер красавчег
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 15.6.2005
Где: World->Russia

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



Рад приветствовать тебя korob2001!

Непонятно вот что к примеру

// Quickly remove BBcode.
$entry = preg_replace("/\[\/?[a-zA-Z*]+[^\]]*\]/", " ", $entry);

Удалить все BBcode из текста
так вот тут суть в том что будут искаться и удалятся квадратные скобки и всё что в них

Как это сделать на перле, вообще не понимаю smile

P.S. А причём тут раздел пхп, мне на перле это надо (хоть это из пхп)
Врядли думаю что мне там помогут.
--------------------
PM MAIL WWW ICQ   Вверх
Kiber_rat
Дата 7.2.2006, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



Если это все perl совместимые регулярные выражения (что видно из названий функций), то перевести это в perl очень просто smile
Код
$_ = " ".strip_tags($entry)." "; # strip_tags - это какая-то своя функция
s!\[(mm|gm|mod|ex|mergetime)\](.+?)\[/\\1\]!!is;
s/[\n\r]/ /is;
s/\[\/?[a-zA-Z*]+[^\]]*\]/ /;
s!(^|\s)((http|https|news|ftp)://\w+[^\s\[\]]+)! !is;
s/\b&[a-z]+;\b/ /;
s/(\:spy\:|\:cool|\:mod|\:lamer)//;



--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
TwiSteR
Дата 7.2.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кибер красавчег
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 15.6.2005
Где: World->Russia

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



Kiber_rat

Спасибо !
Только вот пробую так
Код

sub clean_words {
        my $entry = $_[0];

        $entry =~ s!\[(mm|gm|mod|ex|mergetime)\](.+?)\[/\\1\]!!is;
        $entry =~ s/[\n\r]/ /is;
        $entry =~ s/\[\/?[a-zA-Z*]+[^\]]*\]/ /;
        $entry =~ s!(^|\s)((http|https|news|ftp)://\w+[^\s\[\]]+)! !is;
        $entry =~ s/\b&[a-z]+;\b/ /;
        $entry =~ s/(\:spy\:|\:cool|\:mod|\:lamer)//;

        return $entry;

}

my $u = clean_words("[mm] [ex] test");
print $u;


[mm] Долбит, а вот [ex] уже нет smile
Да и по поводу функции пхпшной strip_tags , она долбит все хтмп теги. Что-то подобное можно организовать ?
--------------------
PM MAIL WWW ICQ   Вверх
Sadok
Дата 7.2.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



TwiSteR
Цитата
[mm] Долбит, а вот [ex] уже нет

ну, так откуда sub возмет этот [ex], если ты передаешь ей только [mm] (my $entry = $_[0];)? smile и это не единственная ошибка.
PM   Вверх
korob2001
Дата 7.2.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ошибка в том, что ты не указал модификатор g, т.е. шаблон находит первое совпадение и останавливаеся. Добавь g там, где нужен глобальный поиск всех вхождений искомой подстроки.
Код

#!/usr/bin/perl -w
use strict;


sub clean_words {
        my $entry = $_[0];

        $entry =~ s!\[(mm|gm|mod|ex|mergetime)\](.+?)\[/\\1\]!!gis;
        $entry =~ s/[\n\r]/ /gis;
        $entry =~ s/\[\/?[a-zA-Z*]+[^\]]*\]/ /g;
        $entry =~ s!(^|\s)((http|https|news|ftp)://\w+[^\s\[\]]+)! !gis;
        $entry =~ s/\b&[a-z]+;\b/ /g;
        $entry =~ s/(\:spy\:|\:cool|\:mod|\:lamer)//g;

        # Удалим лишние пробелы
        $entry =~ s/^\s+//;
        $entry =~ s/\s+$//;
        $entry =~ s/\s+/ /g;

        return $entry;

}

my $u = clean_words("[mht] [ex] test");
print $u;

Я тут добавил код удаляющий лишние пробелы, но это уже сам смотри, если не нужен то удали эти три строки.

Это сообщение отредактировал(а) korob2001 - 7.2.2006, 12:45


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


Кибер красавчег
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 15.6.2005
Где: World->Russia

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



Во спасибо ребята !

А вот как быть с strip_tags в пхп она удаляет хтмл теги, что скажите ?
--------------------
PM MAIL WWW ICQ   Вверх
korob2001
Дата 7.2.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Думаю примерно так:
Код

$entry =~ /<.*?>//g;

вот так должна выглядеть твоя подпрограмма:
Код

#!/usr/bin/perl -w
use strict;

sub clean_words {
        my $entry = shift;
        $entry =~ s!\[(mm|gm|mod|ex|mergetime)\](.+?)\[/\\1\]!!gis;
        $entry =~ s/[\n\r]/ /gis;
        $entry =~ s/\[\/?[a-zA-Z*]+[^\]]*\]/ /g;
        $entry =~ s!(^|\s)((http|https|news|ftp)://\w+[^\s\[\]]+)! !gis;
        $entry =~ s/\b&[a-z]+;\b/ /g;
        $entry =~ s/(\:spy\:|\:cool|\:mod|\:lamer)//g;

        # Удалим теги HTML
        $entry =~ s/<.*?>//g;

        # Удалим лишние пробелы
        $entry =~ s/^\s+//;
        $entry =~ s/\s+$//;
        $entry =~ s/\s+/ /;

        return $entry;
}

my $u = clean_words("<b><font color='#ff0000'>[mht]</font> [ex]</b> <i>test</i>");
print $u;

Но могут возникнуть трудности, так как у HTML нет жёсткой структуры, т.е. один тег может быть расположен на нескольких строках. Для этого нужно соединить весь текст в одну строку а затем применить к нему строку, которую я указал выше.

Это сообщение отредактировал(а) korob2001 - 7.2.2006, 13:57


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


Кибер красавчег
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 15.6.2005
Где: World->Russia

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



korob2001,Kiber_rat

Спасибо за реальную помощь !
--------------------
PM MAIL WWW ICQ   Вверх
Kiber_rat
Дата 7.2.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



korob2001 Я предпочитаю удалять тэги так:
Код
$entry =~ s/<[^>]*>//g;
хотя и этот вариант далек от RFC smile


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
korob2001
Дата 7.2.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А в чём отличие?


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


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



Теоретически в том, что мой вариант работает быстрее smile Можешь проверить на каком -нить html файле. Ну и если верить книжке "Регулярные выражения" он боле правильный...


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
korob2001
Дата 12.2.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Kiber_rat @ 12.2.2006, 16:48 Найти цитируемый пост)
Теоретически в том, что мой вариант работает быстрее  Можешь проверить на каком -нить html файле.


Практически, мой пример работает на треть быстрее.
С моим вариантом:
Код

#!/usr/bin/perl -w
use strict;
use Time::HiRes qw(time);

my $file = "guest.html";
my($start, $stop) = (0,0);

open(F, "< $file") or die "Can't open file '$file': $!\n";
$start = time();
while (<F>) {
       s/<.*?>//g;
}
$stop = time();
close(F);

printf ("%s%.5f", "Затраченное время: " , ($stop - $start));

С твоим:
Код

#!/usr/bin/perl -w
use strict;
use Time::HiRes qw(time);

my $file = "guest.html";
my($start, $stop) = (0,0);

open(F, "< $file") or die "Can't open file '$file': $!\n";
$start = time();
while (<F>) {
       s/<[^>]*>//g;
}
$stop = time();
close(F);

printf ("%s%.5f", "Затраченное время: " , ($stop - $start));

Вот такие цифры получил я:
Первый запуск:
Цитата

Твой: Затраченное время: 0.00194
Мой:  Затраченное время: 0.00130

Повторный запуск:
Цитата

Твой: Затраченное время: 0.00212
Мой:  Затраченное время: 0.00138

Третий запуск:
Цитата

Твой: Затраченное время: 0.00192
Мой:  Затраченное время: 0.00128

Для теста прицепляю два скрипта, с обеими вариантами и html файл, на котором я тестил.

Цитата(Kiber_rat @ 12.2.2006, 16:48 Найти цитируемый пост)
Ну и если верить книжке "Регулярные выражения" он боле правильный...

Я не читал её, хотя много слышал о ней. Но с другой стороны, эта книга уже порядочно устарела.

Это сообщение отредактировал(а) korob2001 - 12.2.2006, 21:15

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  parser.zip 6,99 Kb


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


Эксперт
****


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

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



Ну а вот последняя модификация быстрого удаления smile
Код

s/<*?>//sg;

"?" - нужен по-любому для "ленивого" поиска, что быстрее. С инвертированным классом "[^>]" сложней, при наличии внутренних комментариев в тегах, но будет вернее
Код
 s/<[^>]*?>//sg 


Теперь тестируйте... smile

Это сообщение отредактировал(а) nitr - 13.2.2006, 03:13


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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