Извлечение адресов электронной почты в html-блок в ruby ​​/ rails - PullRequest
0 голосов
/ 06 мая 2010

Я создаю парсер, который защищает от спама и сбора электронных писем из блока текста, который поступает от tinyMCE (поэтому он может содержать или не содержать теги html)

Я пробовал регулярные выражения, и до сих пор это было успешно:

/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i

проблема в том, что мне нужно игнорировать все адреса электронной почты с помощью mailto hrefs. например:

<a href="mailto:test@mail.com">test@mail.com</a>

должен возвращать только второй адрес электронной почты.

Чтобы получить представление о том, что я делаю, я поменяю адреса электронной почты в блоке так, чтобы приведенный выше пример выглядел так:

<a href="mailto:test@mail.com">moc.liam@tset</a>

Проблема с моим текущим регулярным выражением в том, что он также заменяет тот, что в href. Есть ли способ сделать это с помощью одного регулярного выражения? Или я должен проверить один, а затем другой? Есть ли для меня способ сделать это, просто используя gsub, или мне нужно использовать магию nokogiri / hpricot и еще много чего для разбора mailtos? Заранее спасибо!

Вот мои ссылки:

so.com / вопросы / 504860 / экстракт-почтовый-адрес, из-а-блока-в-текста

so.com / вопросы / 1376149 / регулярное выражение-для-извлечения-а-MailTo-адрес

Я также тестирую, используя это:

http://rubular.com/

редактировать

вот мой текущий код помощника:

def email_obfuscator(text)
  text.gsub(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i) { |m|
    m = "<span class='anti-spam'>#{m.reverse}</span>"
  }
end

, что приводит к этому:

<a target="_self" href="mailto:<span class='anti-spam'>moc.liamg@tset</span>"><span class="anti-spam">moc.liamg@tset</span></a>

Ответы [ 3 ]

0 голосов
/ 06 мая 2010

Другой вариант, если вид сзади не работает:

/\b(mailto:)?([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})\b/i

Это будет соответствовать всем электронным письмам, тогда вы можете вручную проверить, является ли первая полученная группа "mailto:", а затем пропустить это совпадение.

0 голосов
/ 06 мая 2010

Почему бы просто не сохранить все соответствующие электронные письма в массиве и удалить все дубликаты ? Вы можете сделать это легко с помощью стандартной библиотеки ruby, и (я думаю) это, вероятно, быстрее / более легко обслуживаемо, чем добавление большей сложности к вашему регулярному выражению.

emails = ["email_one@example.com", "email_one@example.com", "email_two@example.com"]
emails.uniq # => ["email_one@example.com", "email_two@example.com"]
0 голосов
/ 06 мая 2010

Будет ли это работать?

/\b(?<!mailto:)[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i

(?<!mailto:) является негативным взглядом, который игнорирует любые совпадения, начинающиеся с mailto:

К сожалению, у меня не работает Ruby на работе, но он работал с PHP, когда я тестировал его ...

...