0

Web サーバーからダウンロードしたいファイル名を含む HTML ページがあります。サーバーからファイルをダウンロードする Web アプリケーションに渡されるリストを作成するには、これらのファイル名を読み取る必要があります。これらのファイル名には、ある程度の拡張子があります。

私はこのトピックについて掘り下げましたが、他に何も見つかりませんでした-

  1. 正規表現を使用して HTML を解析することはできません。
  2. HTML アジリティ パックを使用する

HTML ファイルから filename.ext のようなパターンを持つテキストを検索する方法は他にありませんか?

ファイル名を含むサンプル HTML -

 <p class=3DMsoNormal style=3D'margin-top:0in;margin-right:0in;margin-bottom=:0in; margin-left:1.5in;margin-bottom:.0001pt;text-indent:-.25in;line-height:normal;mso-list:l1 level3 lfo8;tab-stops:list 1.5in'><![if !supportLists]> <span style=3D'font-family:"Times New Roman","serif";mso-fareast-font-family:"Times New Roman"'><span style=3D'mso-list:Ignore'>1.<span style=3D'font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    </span></span></span><![endif]><span style=3D'font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman"'>**13572_PostAccountingReport_2009-06-03.acc**<o:p></o:p></span></p>

アプリケーションやツールをダウンロードして使用することが許可されていないため、HTML Agility Packを使用できません。

これは他のロジックで達成できませんか?

これは私がこれまでに行ったことです

string pageSource = "";
            string geturl = @"C:\Documents and Settings\NASD_Download.mht";
            WebRequest getRequest = WebRequest.Create(geturl);
            WebResponse getResponse = getRequest.GetResponse();
            using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
            {
                pageSource = sr.ReadToEnd();
                pageSource.Replace("=", "");
            }
           var fileNames = from Match m in Regex.Matches(pageSource, @"[0-9]+_+[A-Za-z]+_+[0-9]+-+[0-9]+-+[0-9]+.+[a-z]")
                          select m.Value;
            foreach (var s in fileNames)
                Response.Write(s);

すべてのファイル名に「=」が含まれているため、ファイル名を取得できません。「=」の出現を削除するにはどうすればよいですかpageSource string

前もって感謝します

アキル

4

3 に答える 3

0

などの一般的なパターンを使用してファイル名を取得することは不可能な場合があります。1.5in -.25in 7.0pt(可能であれば)
/[a-z0-9_-]+\.[a-z]+/gi
/>[a-z0-9_-]+\.[a-z]+</gi(マークアップを含む) など、より具体的にするようにしてください。
/>\d+_PostAccountingReport_\d+-\d+-\d+\.[a-z]+</gi

于 2012-06-27T08:55:38.470 に答える
0

正規表現を使用して、ファイル名のようなものを抽出できますご指摘のとおり、正規表現はHTML を解析しないため、誤検知が発生する可能性があります。つまり、ファイル名のように見えてもそうではない結果が得られる場合があります。

例を見てみましょう:

string html = @"<p class=3DMsoNormal ...etc...";

var fileNames = from Match m in Regex.Matches(html, @"\b[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{3}\b") 
                select m.Value;

foreach (var s in fileNames)
    Console.WriteLine(s);
Console.ReadLine();

これは戻ります

1.5in
1.5in
7.0pt
13572_PostAccountingReport_2009-06-03.acc

ご覧のとおり、ファイル名のようなHTMLが返されます。もちろん、この例の誤検知が除外されるように、正規表現を改良することもできます (たとえば、ドットの前の部分に少なくとも 3 文字が必要になるよう+にに置き換えます)。{3,}それでも、正確な結果ではなく、常におおよその結果になります。

于 2012-06-27T08:53:59.847 に答える
0

regexHTML で値を見つけるのは理想的ではないことを知っています。

var files = [];
var p = document.getElementsByTagName('p');

for (var i = 0; i < p.length; i++){
    var match = p[i].innerHTML.match(/\s(\S+\.ext)\s/)

    if (match)
        files.push(match[1]);
}

ライブデモ

注:質問へのコメントを読んでください。

拡張子が何でもよい場合は、これを使用できます。

var files = [];
var p = document.getElementsByTagName('p');

for (var i = 0; i < p.length; i++){
    var match = p[i].innerHTML.match(/\b(\S+\.\S+)\b/)
    console.log(match)
    if (match)
        files.push(match[1]);
}
document.getElementById('result').innerHTML = files + "";

しかし、これは本当に信頼できません。

ライブデモ

于 2012-06-27T08:42:12.477 に答える