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


Автор: Wowa 25.3.2005, 13:13
Есть некоторый текст (небольшой). Нужно найти в нем все е-маилы, вырезать их и добавить в массив.

Как это сделать?

Автор: skalex 25.3.2005, 17:03
Возможно поможет это:
Код
<?php

$text = 'abc@com.ru foo bar aaa.bbb@host.info zzz bbb dsds4343 name@abc.xyz.com
ds;klf;sdk vasya@pupkin.org';

preg_match_all('%\b([0-9a-z._-]+@(?:[0-9a-z_-]+\.)+[a-z]{2,4})\b%Usi', $text, $m);

echo '<pre>';
print_r($m[1]);

?>


Результат:
Код
Array
(
    [0] => abc@com.ru
    [1] => aaa.bbb@host.info
    [2] => name@abc.xyz.com
    [3] => vasya@pupkin.org
)

Автор: Mal Hack 25.3.2005, 17:10
В качестве рэга могу еще предложить:
Код
"#(\w|\d){1}(\w|\d|\-|_|\.|\+)+?(\w|\d){1}@((\w|\d){1,}(\-|\.){0,1}(\w|\d){1,})+?\.(\w){2,4}#"

Автор: skalex 25.3.2005, 17:16
Mal Hack, я немного доработал твой regexp, чтобы не захламлять выходной массив:
Код

#((?:\w|\d){1}(?:\w|\d|\-|_|\.|\+)+?(?:\w|\d){1}@(?:(?:\w|\d){1,}(?:\-|\.){0,1}(?:\w|\d){1,})+?\.(?:\w){2,4})#

Автор: Mal Hack 25.3.2005, 17:21
Э smile А что измегнил и что это дает? smile

Автор: skalex 25.3.2005, 17:30
Код
regexp
до: #(\w|\d){1}(\w|\d|\-|_|\.|\+)+?(\w|\d){1}@((\w|\d){1,}(\-|\.){0,1}(\w|\d){1,})+?\.(\w){2,4}#
после: #((?:\w|\d){1}(?:\w|\d|\-|_|\.|\+)+?(?:\w|\d){1}@(?:(?:\w|\d){1,}(?:\-|\.){0,1}(?:\w|\d){1,})+?\.(?:\w){2,4})#


Результат

до

Код

Array
(
    [0] => Array
        (
            [0] => abc@com.ru
            [1] => aaa.bbb@host.info
            [2] => name@abc.xyz.com
            [3] => vasya@pupkin.org
        )

    [1] => Array
        (
            [0] => a
            [1] => a
            [2] => n
            [3] => v
        )

    [2] => Array
        (
            [0] => b
            [1] => b
            [2] => m
            [3] => y
        )

    [3] => Array
        (
            [0] => c
            [1] => b
            [2] => e
            [3] => a
        )

    [4] => Array
        (
            [0] => com
            [1] => host
            [2] => abc.xyz
            [3] => pupkin
        )

    [5] => Array
        (
            [0] => o
            [1] => s
            [2] => c
            [3] => i
        )

    [6] => Array
        (
            [0] => 
            [1] => 
            [2] => .
            [3] => 
        )

    [7] => Array
        (
            [0] => m
            [1] => t
            [2] => z
            [3] => n
        )

    [8] => Array
        (
            [0] => u
            [1] => o
            [2] => m
            [3] => g
        )

)


после

Код
Array
(
    [0] => Array
        (
            [0] => abc@com.ru
            [1] => aaa.bbb@host.info
            [2] => name@abc.xyz.com
            [3] => vasya@pupkin.org
        )

    [1] => Array
        (
            [0] => abc@com.ru
            [1] => aaa.bbb@host.info
            [2] => name@abc.xyz.com
            [3] => vasya@pupkin.org
        )

)

Автор: Wowa 25.3.2005, 18:00
Так.. а какой регексп лучше использовать?

Автор: skalex 25.3.2005, 18:31
Admin, а какой regexp тебе больше нравится ? Принципиально, особой разницы нет ...

Автор: Mal Hack 25.3.2005, 19:48
Цитата(Admin @ 25.3.2005, 18:00)
Так.. а какой регексп лучше использовать?

Ну в принципе можно и по пробелам вырезать. Я тут кстати подумал, наилучший вариант - объединить два рэга smile
Код
#[A-Z0-9]{1}[A-Z0-9\-_\.\+]+?[A-Z0-9]{1}@(?:[A-Z0-9]{1,}(?:\-|\.){0,1}[A-Z0-9]{1,})+?\.[A-Z]{2,4})#i

Автор: skalex 28.3.2005, 09:38
Mal Hack, ты в своем последнем regexp-е забыл круглую скобку поставить в начале. smile
И зачем писать вещи типа [A-Z0-9]{1}, если [A-Z0-9] уже означает 1 любой символ от A до Z или любая цифра от 0 до 9 ? А также зачем {1,}, если можно написать + ?
Код
#([A-Z0-9][A-Z0-9\-_\.\+]+?[A-Z0-9]@(?:[A-Z0-9]+(?:\-|\.)?[A-Z0-9]+)+?\.[A-Z]{2,4})#i


Цитата
Ну в принципе можно и по пробелам вырезать.

Что ты имеешь в виду ?

Автор: Mal Hack 28.3.2005, 11:19
Цитата(Mace @ 28.3.2005, 10:38)
ты в своем последнем regexp-е забыл круглую скобку поставить в начале.

Можно вообще опустить smile

Цитата(Mace @ 28.3.2005, 10:38)
Что ты имеешь в виду ?

\s[^\s]+@[^\s] smile

Цитата(Mace @ 28.3.2005, 10:38)
И зачем писать вещи типа [A-Z0-9]{1}, если [A-Z0-9] уже означает 1 любой символ от A до Z или любая цифра от 0 до 9 ? А также зачем {1,}, если можно написать + ?

Вечером сяду додумаю до конца. В примнципе ты прав.

Автор: skalex 28.3.2005, 11:46
Блин, регулярные выражения можно бесконечно составлять... smile
Цитата
Ну в принципе можно и по пробелам вырезать.

ИМХО самое короткое регулярное выражение:
Код
%[^\s]+@.+\..+\b%U

Автор: Mal Hack 28.3.2005, 14:26
Цитата(Mace @ 28.3.2005, 12:46)
\..+\b

А че это за фишка такая?

Автор: skalex 28.3.2005, 15:49
Цитата(Mal @ 28.3.2005, 15:26)
Цитата(Mace @ 28.3.2005, 12:46)
\..+\b

А че это за фишка такая?

\b - претензия "на границе слова".

Автор: IZ@TOP 28.3.2005, 18:27
Цитата(Mace @ 28.3.2005, 16:49)
\b - претензия "на границе слова".

То есть?

Автор: Mal Hack 28.3.2005, 18:35
Цитата(IZ @ 28.3.2005, 19:27)
То есть?

Что-то вроде "не буква" или "конец слова"

Автор: skalex 28.3.2005, 19:18
Цитата(IZ @ 28.3.2005, 19:27)
Цитата(Mace @ 28.3.2005, 16:49)
\b - претензия "на границе слова".

То есть?

Ну да, как бы строго начало (или конец) слова... Т.е. шаблон не может например соприкасаться с цифрой. Т.е. %\b[abc]+\b% не удовлетворяет 123abc456, но будет удовлетворять 123 abc 456. С помощью этой претензии удобно искать слова.

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