0

Rubyの使用:ruby 1.9.3dev(2011-09-23リビジョン33323)[i686-linux]

私は次の文字列を持っています:

str = 'Message relates to activity <a href="/activities/35">TU4 Sep 5 Activity 1</a> <img src="/images/layout/placeholder.png" width="222" height="149"/><br/><br/>First question from Manager on TU4 Sep 5 Activity 1.'

私は以下に一致したい:

35(href属性値の一部である数値)
TU4 9月5日アクティビティ(タグのテキスト)TU4 9月5日アクティビティ1に関するマネージャーからの最初の質問(最後のタグ
の後の残りのテキスト)<br/><br/>

同じことを達成するために、私は次の正規表現を書きました

result = str.match(/<a href="\/activities\/(?<activity_id>\d+)">(?<activity_title>.*)<\/a>.*<br\/><br\/>(?<message>.*)/)

これにより、次の結果が生成されます。

#<MatchData "<a href=\"/activities/35\">TU4 Sep 5 Activity 1</a> <img src=\"/images/layout/placeholder.png\" width=\"222\" height=\"149\"/><br/><br/>First question from Manager on TU4 Sep 5 Activity 1." 
         activity_id:"35" 
         activity_title:"TU4 Sep 5 Activity 1" 
         message:"First question from Manager on TU4 Sep 5 Activity 1.">

しかし、これは効率的ではないと思います。どういうわけか、必要な値(上記のように一致させたいもの)のみが一致した結果に返され、次の値が一致した結果から除外される可能性はありますか?

"<a href=\"/activities/35\">TU4 Sep 5 Activity 1</a> <img src=\"/images/layout/placeholder.png\" width=\"222\" height=\"149\"/><br/><br/>First question from Manager on TU4 Sep 5 Activity 1."

ありがとう、

ジグネシュ

4

1 に答える 1

1

これを行う適切な方法は、正規表現を使用しないことです。代わりに、Nokogiri ライブラリを使用して、HTML を簡単に解析します。

require 'nokogiri'

doc = Nokogiri::HTML.parse(str)
activity_id = doc.css('[href^="/activities"]').attr('href').value[/\d+$/]
activity_title = doc.css('[href^="/activities"]')[0].inner_text
message = doc.search("//text()").last

これは、ランダムな失敗の可能性がはるかに低く、正規表現が試みていたことを正確に実行します。

于 2012-12-11T10:20:45.223 に答える