ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

正規表現を使いたいのですが、
javascriptでは戻り読み表現が使えないと知って困っています・・・

<a href="http://abc.com/"><img src="http://image.abc.com/def.jpg"></a>
<a href="http://hogehoge.com/"><img src="http://hogehoge.com/hoge.jpg"></a>
<a href="http://123.com/"><img src="http://456.com/789.jpg"></a>
<a href="http://momomo.com/"><img src="http://lelele.com/momo.jpg"></a>
上記のソースから

http://image.abc.com/def.jpg
http://hogehoge.com/hoge.jpg
http://456.com/789.jpg
http://lelele.com/momo.jpg
だけをマッチさせたいです。
(画像のパスだけをマッチさせたい)

URLは今後も増える可能性があり、サイト名、文字数、画像名などもバラバラです。

うまくマッチさせる方法はありますでしょうか。
詳しい方いらっしゃいましたらよろしくお願いします!

このQ&Aに関連する最新のQ&A

A 回答 (4件)

あまり詳しくないですが、


2段階に分けてパーズしてみてはいかがでしょう。

(function(){

var src = document.getElementsByTagName('body')[0].innerHTML;

var regex1 = new RegExp( '<[^>]*>', 'g' );
var regex2 = new RegExp( '<img\\s[^>]*src="([^">]+)"[^>]*>', 'i' );

var tags = src.match( regex1 );

for( var i in tags ){

 var tag = tags[i];

 if( regex2.test( tag ) ){

  var matches = regex2.exec( tag );
  var url = matches[1];

  alert( url );

 }

}

})();
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
結論としては、1段階でのマッチは不可能ということでしょうか。

情けないことに教えてくださった内容の半分も理解できていないのですが、ご回答とソースとにらめっこで何とかがんばってみます。

内容がわからないので、ベストアンサーは一番早く回答をくださった方にさせていただきます。
本当にありがとうございました!

お礼日時:2011/04/20 15:25

dom かぁ



なら、1.8で
alert (Array.map (document.querySelectorAll ('a > img'), (function (i) i.src)).join ('\n'));
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

お礼日時:2011/04/20 15:27

既に正解が出てますが。

。。
正規表現を使わずにDOMアクセスじゃ駄目なんですか?
--------------------------------------------------------
<body>

<a href="http://abc.com/"><img src="http://image.abc.com/def.jpg"></a>
<a href="http://hogehoge.com/"><img src="http://hogehoge.com/hoge.jpg"></a>
<a href="http://123.com/"><img src="http://456.com/789.jpg"></a>
<a href="http://momomo.com/"><img src="http://lelele.com/momo.jpg"></a>

<script type="text/javascript">

var i;
var imgs = document.getElementsByTagName('img');
var pool = [];


for( i = 0; i < imgs.length; i++ )
{
pool.push( imgs[i].src );
}

alert( pool );

</script>
</body>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

お礼日時:2011/04/20 15:27

var str = document.getElementsByTagName('body')[0].innerHTML;


var reg = /(?:<img\s+src\s*=\s*"(.+)?".*?>)/g;
var rst = [];
var tmp;

while (tmp = reg.exec (str))
 rst.push (tmp[1]);

alert(rst.join("\n"));

とか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

お礼日時:2011/04/20 15:26

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q正規表現の否定先読みで、複数の否定文字列を指定する方法はありませんか?

正規表現の否定先読みで、複数の否定文字列を指定する方法はありませんか?

例えば、
/(a)(?!bbb)/
は、後ろにbbbが続かないaを意味すると思いますが、
後ろにbbb、ccc、dddのいずれもが続かないaを表現する方法を探しています。

Aベストアンサー

単純に
/a(?!bbb|ccc|ddd)/
じゃダメなんだっけ?

Q"cp -a"と"cp -r"の違い

"cp -a"と"cp -r"の違い

-aは「できるだけ属性や構造を保持する」
-rは「ディレクトリを再帰的にコピーする」
ですが、「属性や構造を保持する」「再帰的にコピーする」の意味がよくわかりません。

また、コピーしたいディレクトリから下のディレクトリやファイルまで含めてそのままコピーするにはどちらが適しているのでしょうか?

Aベストアンサー

> コピーしたいディレクトリから下のディレクトリやファイルまで含めてそのままコピーする

「下のディレクトリやファイルまで含めて」という条件だけを指定するのが-rオプションです。
-rオプション無しだと、cpはファイルしかコピーできませんが、-rオプションを付けると
「コピーしようとしている物がディレクトリだったら、その中に入っている物をコピーする」
「そうやってコピーしようとしている物がまたディレクトリだったら、さらにその中に入っている物をコピーする」

と、順次ディレクトリを辿ってコピーしていきます。
この「ディレクトリを順次辿る」ことを「再帰的」と称しています。

一方、-aオプションの「属性」は、ファイルのタイプスタンプなどのことです。
-a 無しだと、ファイル先のファイルの更新時刻はコピーを実行した時刻になりますが、-a を付けると、更新時刻などもコピー元と同じになります。
「構造」とは、ディレクトリやシンボリックリンクなどの、特殊なファイルのことです。そのため、-aオプションでも-rオプションと同じく、再帰的なコピーは行います

-rオプションでは、タイムスタンプなどの情報が消えてしまいますし、
シンボリックリンクも「ファイルとしてコピー」されてしまいますので、「そのままコピーする」のなら、 -a オプションの方がいいでしょう。

> コピーしたいディレクトリから下のディレクトリやファイルまで含めてそのままコピーする

「下のディレクトリやファイルまで含めて」という条件だけを指定するのが-rオプションです。
-rオプション無しだと、cpはファイルしかコピーできませんが、-rオプションを付けると
「コピーしようとしている物がディレクトリだったら、その中に入っている物をコピーする」
「そうやってコピーしようとしている物がまたディレクトリだったら、さらにその中に入っている物をコピーする」

と、順次ディレクトリを辿...続きを読む

Q【正規表現】【javascript】CR、CR・LF、LF改行コードをLFにしたい

CR、CR+LF、LFのシステムによって異なる3種類の改行コードを
LFに置換したいです。

変数hogeに置換対象の文字列が入っているとして、
hoge.replace(/\r\n/g,"\n").replace(/\r|\n/g,"\n");
とreplaceを使って置換してみました。

うまくいってるようですが、replaceを二度使ってるところが、カッコ悪いなぁと思います。

replace一回ですむような方法がありましたら教えてください。

Aベストアンサー

hoge.replace(/\r\n?/g,"\n");

QVBSのRegExpの拡張機能を有効にするには

VBScriptのRegExpオブジェクトで拡張機能を有効にするにはどのようにすればいいのでしょうか。例えば、後方一致(先読み)は正しく実行できますが、前方一致(後読み)は拡張機能となっているためそのままではエラーになりますがどのようにすれば前方一致(後読み)の機能が使えるようになるのでしょうか。(OSはWindowsXPです)
-------------------------------------
Option Explicit
dim a
dim bs
dim b
Dim o
Set o = new RegExp
o.IgnoreCase = False
o.Global = True
o.pattern = "\d+(?=年)"            '後方一致  <OK>
'o.pattern = "(?<=昭和)\d+"         '前方一致  <ERROR>
a="昭和45年と平成26年"
Set bs = o.Execute(a)
For Each b in bs
 WScript.echo b.FirstIndex+1 & "文字目の" & b.Value & "がマッチしました"
Next
Set o = Nothing
-------------------------------------

VBScriptのRegExpオブジェクトで拡張機能を有効にするにはどのようにすればいいのでしょうか。例えば、後方一致(先読み)は正しく実行できますが、前方一致(後読み)は拡張機能となっているためそのままではエラーになりますがどのようにすれば前方一致(後読み)の機能が使えるようになるのでしょうか。(OSはWindowsXPです)
-------------------------------------
Option Explicit
dim a
dim bs
dim b
Dim o
Set o = new RegExp
o.IgnoreCase = False
o.Global = True
o.pattern = "\d+(?=年)"          ...続きを読む

Aベストアンサー

使用している拡張機能の構文からするとおそらく以下のページを参照されたのでしょう。
http://srcedit.pekori.jp/tool/re.html

しかし、そのページには
> 当ツールの正規表現エンジンはVBScriptのRegExpオブジェクトですが、
> 一部の表現は拡張機能でオリジナルとなっています。
と書いてあり、あなたが使えないと相談された拡張機能はその中に含まれます。

このページの大元をたどると以下のページにあたります。
http://srcedit.pekori.jp/tool/excelre.html
このページを読めばわかる通り、ページの筆者はExcelのアドインとして正規表現ツールを提供しており、先ほどのページはそのツールで使える正規表現の説明です。

つまり、この筆者が作成した正規表現ツールのVBScriptのRegExpからの拡張機能を、マイクロソフトがVBScript RegExpに追加した「正規表現の標準規格」(あればの話ですが)からの拡張機能と誤解されての質問と思われます。

QVBAで改行の入ったデータの正規表現について

vbaで複数行のデータの一部を抜き出そうと思っています。
下記のようにすると、抜き出したデータの先頭に改行がついてしまいます。
何かいい方法はないでしょうか。


data = "start" & vbCrLf  & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf & "end"

Set re = New RegExp

re.Pattern = "start((.|\n)*?)end"

re.MultiLine = True

Set mc = re.Execute(data)

For i = 0 To mc.Count - 1

MsgBox m.SubMatches(0)

Next i


上記を実行すると

vbCrLf  & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf

となってしまいます。

”ABC”から抜き出す場合、正規表現をどう書けばいいのでしょうか。
よろしくお願いします。

Aベストアンサー

こんにちは。

vbCrLfを表すパターンは、
 \r\n
です。

Sub Re8780307()
Dim re As VBScript_RegExp_55.RegExp
Dim mc As VBScript_RegExp_55.MatchCollection
Dim m As VBScript_RegExp_55.Match
Dim Data
  Data = "start" & vbCrLf & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf & "end" & vbCrLf & _
    "start" & vbCrLf & "JKL" & vbCrLf & "MNO" & vbCrLf & "PQR" & vbCrLf & "end"
  
  Set re = New RegExp
  re.Global = True
  re.MultiLine = True
  re.Pattern = "start(\r\n((.|\r\n)*?)\r\n)end"
  
  Set mc = re.Execute(Data)
  For Each m In mc
    Debug.Print "■"; m.SubMatches(1); "■"
  Next
End Sub

みたいなことをなさりたいのでは?

こんにちは。

vbCrLfを表すパターンは、
 \r\n
です。

Sub Re8780307()
Dim re As VBScript_RegExp_55.RegExp
Dim mc As VBScript_RegExp_55.MatchCollection
Dim m As VBScript_RegExp_55.Match
Dim Data
  Data = "start" & vbCrLf & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf & "end" & vbCrLf & _
    "start" & vbCrLf & "JKL" & vbCrLf & "MNO" & vbCrLf & "PQR" & vbCrLf & "end"
  
  Set re = New RegExp
  re.Global = True
  re.MultiLine = True
  re.Pattern = "start(\...続きを読む

Q「いずれか」と「いづれか」どっちが正しい!?

教えて下さいっ!
”どちらか”と言う意味の「いずれか」のかな表記として
「いずれか」と「いづれか」のどちらが正しいのでしょう???

私は「いずれか」だと思うんですが、辞書に「いずれか・いづ--。」と書いてあり、???になってしまいました。
どちらでもいいってことでしょうか?

Aベストアンサー

「いずれか」が正しいです.
「いづれ」は「いずれ」の歴史的かな遣いですので,昔は「いづれ」が使われていましたが,現代では「いずれ」で統一することになっていますので,「いずれ」が正しいです.

QJavaScriptにおいてPOSTで送信されたデータを取得出来ますか

<form action="自分" method="POST">
<input type="hidden" name="abc" value="1">
<input type="submit" name="OK" value="OK">
</form>

上記のように、POST渡しで送信したとき、Javascriptにて、hiddenのデータを取得することができるのでしょうか?

出来るのであればその方法を教えてくださいませんか。
よろしくお願いします。

Aベストアンサー

POSTで渡された変数をJavaScriptで取得することができません。
でも、action先は自分自身なんですよね?
だったら、submitボタンを押下されたときに、hiddenの値を参照すればいいのでは?
わざわざPOSTデータを参照する必要があるのでしょうか?

Q正規表現でAND検索はできるのでしょうか

正規表現でAND検索はできるのでしょうか?

現在ASPでデータベースのデータを検索しようとしているのですが,検索エンジンみたいに複数の語をスペースで区切って入力して,データを絞り込んで表示したいのです。

OR検索みたいにそれぞれの語を"|"でつなぐというようなやり方があるのでしょうか?
それとも一つ一つの語で検索を繰り返すという方法しかないのでしょうか?

ご存知の方,ご教授ください。

Aベストアンサー

&&でつながれたらいかがですか?

(?=.*stat)(?=.*ate)はAND検索という意味ではありません。
statedのようにstatとateを重複して含む単語にマッチするという意味です。

普通はこんな回りくどいことはせず、
/stat/ && /ate/
で済ませると思います。
(もしくは単純にループでまわしていくとか)


foo.*bar|bar.*foo
も、2語程度までが限界ですよね。
10語分繋げることを考えると気が遠くなります。
(記述も処理時間も)

言語によってはさらに処理を短縮できるような
特有な構文がありますから、調べてみればよろしいかと思います。

QCSVファイルの中で、「 , 」カンマを使いたい

「 , 」で区切られたCSVファイルの中で、「 , 」カンマを使いたいのですが、可能でしょうか?

具体的には「これは1,500円でした。」というように、CSVファイルに収められた文章内で出てくる半角の数字(お金)の区切りに使いたいのです。
全角では代用したくないのですが、CSVファイルでデータを受け渡しする際に、困っています。

例えば、特殊文字などで対応可能でしょうか?

Aベストアンサー

受け渡しに使うと言うことは相手方のアプリケーションのことも考えなければいけないのですが・・・とりあえず対応が簡単そうな方法を。

1.各セルを""で囲む。(もちろんデータにダブルクォートがある場合はカンマと同様に困ります。
2.カンマで区切らずにタブで区切る。(比較的使われない文字ですが、やはりデータ中にタブがあるとカンマと同様です)

難しいけれど完璧に対応するためには、データ中の区切り文字は特殊な文字列に変更し、受け取り側のアプリケーションではその特殊な文字列をデータ中の区切り文字として扱うという方法が使われます。
例えば、データ中のカンマは\,にするとか。

データ作成側、受け取り側でそれぞれどこまで対応できるのか分かるともっと簡単かつ具体的な方法を回答できるかも知れません。

QjavascriptでIMEの状態を取得

javascriptでIMEの状態を取得できる簡単な方法はありませんか?

if (event.keyCode == 13 )だと、エンターを押したことが取得できるようです。

それと同じく、IMEがオンかオフかを判別したいのです。

ご存知の方、よろしくお願いします。

Aベストアンサー

ご要望を満足するかどうかわかりませんが、「IME入力中の判定」の解説があります。
ご参考になりませんか?。

http://hondou.homedns.org/pukiwiki/pukiwiki.php?Javascript%20IME%C6%FE%CE%CF%C3%E6%A4%CE%C8%BD%C4%EA


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング