#regex #xml #url #atom-feed
#регулярное выражение #xml #url #atom-feed
Вопрос:
Из-за redbubble.com из-за отсутствия API я использую ATOM feed для кражи информации о пользовательских изображениях.
Вот как выглядит XML:
<entry>
<id>ID</id>
<published>Date Published</published>
<updated>Date Updated</updated>
<link type="text/html" rel="alternate" href="http://www.redbubble.com/link/to/post"/>
<title>Title</title>
<content type="html">
Blah blah blah stuff about the image..
amp;<a href="http://www.redbubble.com/products/configure/config-id"amp;>amp;<img src="http://ih1.redbubble.net/path-to-image" alt="" /amp;>
</content>
<author>
<name>Author Name</name>
<uri>http://www.redbubble.com/people/author-user-name</uri>
</author>
<link type="image/jpeg" rel="enclosure" href="http://ih0.redbubble.net/path-to-the-original-image"/>
<category term="1"/>
<category term="2"/>
</entry>
В принципе, используя regex … как бы я мог получить href
свойство внутри ссылки в теге content?
Одна вещь, которую мы знаем наверняка, это то, что в пути всегда будет указано configure, т. Е. http://somesite.com/**configure**/id
Итак, в принципе, мне просто нужно найти URL с помощью configure in и получить все это целиком…
Ответ №1:
Следующее регулярное выражение извлечет содержимое href на основе ваших требований. Похоже, это работает для примера кода.
href="(w[^"] /configure/w[^"] )
Комментарии:
1. Почему бы не использовать lookaheads / lookbehinds?
2. @ishpeck — Я считаю, что это может быть более эффективным поиском в regex.
3. @stema — спасибо — вы правы. Вероятно, лучше без
w
Ответ №2:
Какой бы язык программирования вы ни использовали, не пытайтесь анализировать все это с помощью регулярного выражения. Сначала используйте анализатор XML для извлечения href="..."
. Затем, конечно, используйте регулярное выражение, чтобы убедиться, что URL содержит configure
.
Как прокомментировал @KARASZI, XPath — еще один хороший подход.
Комментарии:
1. Сначала разбирайте XML, только если производительность действительно является проблемой. В противном случае просто используйте регулярное выражение — его гораздо проще кодировать…
Ответ №3:
Если вам нужно использовать регулярное выражение, попробуйте это:
href="(?=[^"]*configure)([^"]*)
Я использую предварительный просмотр, чтобы найти, содержит ли он configure.
Ответ №4:
Спасибо за ваши потрясающие ответы, но мой коллега решил это за меня!
Это то, что я в итоге использовал:
/http://([^"/]*/)*configure/([^"]*)/
(Кстати, регулярное выражение Ruby)