単二電池

JavaScript にて、正規表現を使って文字列取得を行っております。

例えば、
----------
<p><span>※</span> テキストテキスト</p>
----------

こうであった場合、
/^<p><sup>([\s\S]*)\/p>$/
このような形で取得してみたのですが、
これだと仮に

----------
<p><span>※</span> テキストテキスト</p>
<p>ここは取得しない。</p>
----------

このような文章のパターンの場合、

----------
<p>ここは取得しない。</p>
----------
ここの部分まで取得してきてしまいます。(後続に p 要素が続く限り全て取得してきてしまう。)

これを最初の p 要素の閉じタグまでとしたいです。
何か方法ありますでしょうか。
ご教授お願い致します。

A 回答 (2件)

この手の処理を行うならば、HTML解析した後で DOM や XPath を使うことをお勧めします。


そうすればつまらない問題に悩まされることも無く、間違いの無い処理ができるでしょう。

が、多少の間違いには目をつぶっても、正規表現で簡単に行いたいならば、
単語区切りの \b と、最短一致数量子 *? を使えば、まずまずの結果が得られると思います。

var re = /<p\b.*?>.*?<span\b.*?>(.*?)<\/span\b.*?>(.*?)<\/p\b.*?>/g;
var m = re.exec(文字列);
if (m) 結果表示(m[1] + ' ' + m[2]);
    • good
    • 0
この回答へのお礼

すみません、お返事遅れました。
ご回答ありがとうございます!

やはり正規表現でテキスト置換していくのではなく、
DOM 操作である程度のところまでもっていくのが良いですよね。。。

手法としてどちらにしようか迷っていて、ただの String データを正規表現置換でさくっと処理できればそちらでいいかなと思ったのですが、
やってみると予想外に躓いてしまいました。。

回答いただいた正規表現を参考にしつつ、改めて DOM 操作の方向でも検討したいと思います。
ありがとうございました!

お礼日時:2016/05/11 11:08

最短マッチ



<script>
var reg=new RegExp("<p>.*?</p>","g");
var mystr="<p><span>※</span> テキストテキスト</p>\n<p>ここは取得しない。</p>";
document.write(mystr.match(reg)[0]);
</script>
    • good
    • 0
この回答へのお礼

すみません、お返事遅れました。
ご回答ありがとうございます!

「.*」では試していたんですが、「.*?」とすれば良いのですね。
この手法に若干正規表現の条件を付け加えていけば再現できそうです。
ありがとうございました!

お礼日時:2016/05/11 11:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!