2013-11-15 5 views
-1

Я пишу an importer for PHPbb to Discourse, используя Ruby.Извлечение HTML-текста с помощью регулярного выражения?

Все по базе данных PHPBB являются строками, как

<!-- s:(--><img src="{SMILIES_PATH}/rice_frown.png" alt=":(" title="Frown" /><!-- s:(--> 
<!-- s:'(--><img src="{SMILIES_PATH}/rice_crying.png" alt=":'(" title="Crying" /><!-- s:'(--> 

мне нужно заменить строку с символами в атрибуте альт, поэтому для выше мне нужно :( и :'(. Я заменяю другие вещи регулярными выражениями, но я не могу получить правильный шаблон для этого.

ответ

1

Поскольку люди всегда бывают быстры, чтобы указать, you can't completely parse HTML with regex. Однако это не значит, что вы не можете делать полезные вещи с HTML и регулярным выражением. В вашем случае это не особо трудная проблема. Попробуйте это:

<img .*?alt="(.*?)".*?> 

И просто заменить эти матчи с первой группой:

input.gsub /<img .*?alt="(.*?)".*?>/i, '\1' 

Если вы действительно хотите быть SUPER РОБАСТНЫМИ, вы можете куклу, что регулярное выражение вверх немного:

s.gsub /<\s*img .*?al­t\s*=\s*([­"'])(.*?)\­1.*?>/i, '(\2)­' 

Эта инструкция обрабатывает следующие варианты (примечание, пробел, тип котировки и капитализация):

< img alt="foo" /> 
<IMG alt="foo" /> 
<img alt = "foo" /> 
<img alt='foo' /> 

И так далее ....

2

Есть лодки библиотек, которые позволяют загружать HTML. Наиболее известным является Nokogiri, с помощью которого вы можете сделать

string = '<!-- s:(--><img src="{SMILIES_PATH}/rice_frown.png" alt=":(" title="Frown" /><!-- s:(-->' 
alt_str = Nokogiri::HTML(string).css("img").first["alt"] 
+0

Правда, но зачем использовать библиотеку, когда будет выполняться одно регулярное выражение? :) Я буду держать нокогири в виду, хотя, спасибо. – rikkit

+0

Почему. Что происходит, когда * изменяется HTML, а регулярное выражение прерывается. Если вы не являетесь владельцем HTML и можете убедиться, что он не изменится, вам придется планировать сохранение шаблона. Парсер, такой как Nokogiri, смягчает проблему, разбивая содержимое на нечто более устойчивое. Да, регулярное выражение классно, но они не созданы для HTML. Вы можете заставить их работать, но результат неустойчив. Иногда нам приходится предварительно обрабатывать HTML, прежде чем передавать его в синтаксический анализатор, чтобы исправить патологически поврежденную разметку, в противном случае попробуйте сначала синтаксический анализатор; По умолчанию этот маршрут стоит поистине. –

+0

Я получаю это, но в этом конкретном случае мне не нужна гибкость. PHPbb3 содержит только смайлики в этом странном формате. – rikkit

Смежные вопросы