0

誰かがidを非常に高く評価するのを手伝ってくれるなら、正規表現でゴミを捨ててください。

それは私が想像する少し難しいものになるでしょう-それで私の帽子はそれを解決できる人も誰でも嫌いです!

したがって、次の形式の2つのhtmlタグを含むファイルがあるとします。

abc1234
<a href="http://google.com">Some Text</a> <P>
<a href="http://www.google.com" rel="nofollow">Some Text</a>
abc1234

URLを除くこれらのタグのすべてを削除しようとしている(そして他のテキストを残している)ので、このドキュメントの正規表現の出力は次のようになります

abc1234
http://google.com <P>
http://www.google.com
abc1234

誰かがこれを理解できますか?両方のケースを処理するために1つの正規表現を使用することをお勧めしますが、2つの別個の式でも問題ありません。

前もって感謝します/

4

2 に答える 2

2

ScottStevens、正規表現を使用してhtmlを解析しようとするのは難しいことはよく知られています。実際、この問題についてはかなり詳細な投稿があります。ただし、これらが<a>これまでに採用された2つの形式のみである場合、問題へのアプローチは次のとおりです。

この問題に取り組む方法についての最初の手がかりは、両方のタグがで始まり<a href="、それを取り除きたいということです。そのためには、単純な削除で'<a href="'正規表現は必要ありません。

次の手がかりは、終了タグにある場合">...</a>とある場合があることです" rel=...</a>(rel =の間にあるものと、正規表現の観点からは重要ではありません)。" rel="...</a>ここで、がどこかに含まれていることに注意して">...</a>ください。" rel="...</a>これは、2つのステップで削除" rel="...し、最大で削除してから、">を削除できることを意味します">...</a>。さらに、の1つのタグの間だけを確実に削除するには、のに、は存在できない<a...>...</a>という追加の制約を追加します。...">...</a><a

それと正規表現のチートシートは、始めるのに役立ちます。


そうは言っても、実際にはhtmlパーサーを使用する必要があります。PHP用の堅牢で成熟したHTMLパーサー

于 2012-07-23T17:27:18.793 に答える
1

私はRubyistなので、私の例はRubyになります。物事をまっすぐにするために、2つの正規表現を使用することをお勧めします。

url_reg = /<a href="(.*?)"/   # Matches first string within <a href=""> tag
tag_reg = /(<a href=.*?a>)/   # Matches entire <a href>...</a> tag

最初の正規表現を含むURLを取り出して一時的に保存してから、タグの内容全体(tag_regと一致)を保存されたURLに置き換えます。

あなたはそれを組み合わせることができるかもしれませんが、それは良い考えではないようです。元のタグを(削除して)基本的に変更し、それ自体の内部にあるものに置き換えます。これらの2つのステップを可能な限り分離すると、問題が発生する可能性が低くなります。

Rubyでの例

def replace_tag(input)
  url_reg = /<a href="(.*?)"/    # Match URLS within an <a href> tag
  tag_reg = /(<a href=.*?a>)/     # Match an entire <a href></a> tag

  while (input =~ tag_reg) # While the input has matching <a href> tags
    url = input.scan(url_reg).flatten[0]  # Retrieve the first URL match
    input = input.sub(tag_reg, url)       # Replace first tag contents with URL
  end

  return input
end

File.open("test.html", "r") do |html_input|       # Open original HTML file
  File.open("output.html", "w") do |html_output|  # Open an output file
    while line = html_input.gets                  # Read each line
      output = replace_tag(line)                  # Perform necessary substitutions
      html_output.puts(output)                    # Write output lines to file
    end
  end
end

Rubyを使用していなくても、この例が理にかなっていることを願っています。与えられた入力ファイルでこれをテストしたところ、期待どおりの出力が得られました。

于 2012-07-23T17:26:04.290 に答える