質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

2970閲覧

正規表現で任意の位置以降を削除するには

MISOSHIRU

総合スコア31

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2017/04/25 02:12

編集2017/04/25 05:22

###前提・実現したいこと
Rubyで正規表現を使い、任意のhtml文字列に掛ける正規表現処理を作っています。

###質問(作りたい処理)

真ん中くらいのhtmlタグ以降の文字列を削除するにはどうしたら良いでしょうか? 以下、例1,2のようなあらゆるhtml文字列に対応したいです。 例1: <p>~~~</p> <h2>~~</h2> <p class="aaa">~~~</p> ~~~以降は削除~~~ <p>~~~</p> <a>~~~</a> 例2: <p style="text-align: left;"><a href="http://naiken.nurve.jp/" target="_blank">VR内見公式サイト</a></p> <p style="text-align: left;"> <a href="http://hoge.jpg" rel="attachment wp-att-96738> <img class="hoge" src="http://hoge.jp/hoge.jpg" alt="sub" width="000" height="000"/> </a> </p> ~~~以降を削除~~~ <p style="text-align: left;">Hello</p> <h2 style="text-align: left;">Hello</h2>

###該当のhtml文字列

Ruby

1 2content = ' 3<h2>aaaについて</h2> 4<p class="sssssss"><a href="http://~~~~~~~~~"><img class="~~~" /></a></p> 5<p>~~~~~~~~~~~~~~~~~~~~</p> 6<p>aaaaaaaaaaaaaaaaaaaa</p> 7<h3><i class="~~~~~~~~~~"></i><span>hoge</span></h3> 8<p><iframe width="000" height="000" src="https://www.youtube.com/embed/aaaaaa></iframe></p> 9<h2>aaaaaaa</h2> 10<p>~~~~~~~~~~~~~~~~~~~</p> 11'

###試したこと
htmlタグを取得する正規表現は以下のように作ってみました。
間違っていたらすみません。

Ruby

1/<(.*)\s*.*>.*<\/\1>/

gsubメソッドで第2引数に空欄を指定することで削除ができました。

Ruby

1content.gsub(/正規表現/, "")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2017/04/25 02:50

質問は何ですか?
MISOSHIRU

2017/04/25 03:38 編集

わかりにくくてすみません!質問は、【真ん中くらいのhtmlタグ以降の文字列を削除するにはどうしたら良いでしょうか?】です!
otn

2017/04/25 07:27 編集

「真ん中くらい」とは?? 2つ目のPタグの後と言う事??
MISOSHIRU

2017/04/25 07:27

すみません!!!【マッチした文字列3番目より以下を削除】という意味です・・・!!
otn

2017/04/25 07:33

それって、例とあってない気がしますが。
guest

回答2

0

Ruby

1content = ' 2<p>~~~</p> 3<h2>~~</h2> 4<p class="aaa">~~~</p> 5~~~以降は削除~~~ 6<p>~~~</p> 7<a>~~~</a> 8' 9puts(content.sub(/(<p class="aaa">.*?<\/p>).*/m, "\\1"))

出力結果

<p>~~~</p> <h2>~~</h2> <p class="aaa">~~~</p>

投稿2017/04/25 03:55

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MISOSHIRU

2017/04/25 05:07

迅速な回答ありがとうございます! 助かります・・・!! 追記ですが、例2でも(どんなhtml文字列に対しても)、半分くらい以降(だいだい、~~~以降を削除~~~ 以降)を削除できるプログラムはどうしたら良いでしょうか・・・?
Zuishin

2017/04/25 05:28 編集

大前提として、あなたの欲しいコードを一から十まで全部書いてあげるつもりはありません。 もしそれを求めておられるなら正当な報酬をいただきます。 開発は終わっているので、今回の追記に対応する場合は、開発料金に加えて一年分のメンテナンス料を頂きます。 正規表現は読めますか? どうしてこれでできるのか、私の書いたものを解説してみてください。 間違えておられるところがあれば直します。 それくらいなら無料で結構です。
Zuishin

2017/04/25 05:33

基本的にここは自分でプログラミングする人が調べてもわからないことを相談する場所です。無償で仕事を依頼するところではありません。
MISOSHIRU

2017/04/25 07:29

かしこまりました、何度も申し訳ございませんでした・・・!!! ご指摘ありがとうございます・・・!!!
Zuishin

2017/04/25 07:44

これが読めたらあとは応用でちょっと変更するだけでできますから。
退会済みユーザー

退会済みユーザー

2017/04/25 08:15

勉強になります。
guest

0

ベストアンサー

Ruby

1 2#encoding: utf-8 3 4sample1 = ' 5<p>~~~</p> 6<h2>~~</h2> 7<p class="aaa">~~~</p> 8~~~以降は削除~~~ 9<p>~~~</p> 10<a>~~~</a> 11' 12 13sample2 = ' 14<p style="text-align: left;"><a href="http://naiken.nurve.jp/" target="_blank">VR内見公式サイト</a></p> 15<p style="text-align: left;"> 16 <a href="http://hoge.jpg" rel="attachment wp-att-96738> 17 <img class="hoge" src="http://hoge.jp/hoge.jpg" alt="sub" width="000" height="000"/> 18 </a> 19</p> 20~~~以降を削除~~~ 21<p style="text-align: left;">Hello</p> 22<h2 style="text-align: left;">Hello</h2> 23' 24 25sample3 = ' 26<h2>aaaについて</h2> 27<p class="sssssss"><a href="http://~~~~~~~~~"><img class="~~~" /></a></p> 28<p>~~~~~~~~~~~~~~~~~~~~</p> 29<p>aaaaaaaaaaaaaaaaaaaa</p> 30<h3><i class="~~~~~~~~~~"></i><span>hoge</span></h3> 31<p><iframe width="000" height="000" src="https://www.youtube.com/embed/aaaaaa></iframe></p> 32<h2>aaaaaaa</h2> 33<p>~~~~~~~~~~~~~~~~~~~</p> 34' 35 36 37content = Array.new 38content.push(sample1) 39content.push(sample2) 40content.push(sample3) 41 42content.each do |e| 43 if e[0] == "\n" 44 e.slice!(0) 45 end 46 47 data = e.chomp.split("\n") 48 checklist = data.map.with_index{|e, i| i if e.include?("/p>") }.compact 49 50 puts data[0..checklist[1]] #ここを変更 51 puts "" 52end

実行結果例

<p>~~~</p> <h2>~~</h2> <p class="aaa">~~~</p> <p style="text-align: left;"><a href="http://naiken.nurve.jp/" target="_blank">VR内見公式サイト</a></p> <p style="text-align: left;"> <a href="http://hoge.jpg" rel="attachment wp-att-96738> <img class="hoge" src="http://hoge.jp/hoge.jpg" alt="sub" width="000" height="000"/> </a> </p> <h2>aaaについて</h2> <p class="sssssss"><a href="http://~~~~~~~~~"><img class="~~~" /></a></p> <p>~~~~~~~~~~~~~~~~~~~~</p>

正規表現ではないですが考えてみました。
「\p>」の数を数えて2番目に出現したところまでで切って表示しています。

投稿2017/04/25 08:43

編集2017/04/25 14:43
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問