4

この問題の解決策を見つけるのに苦労しています。
多数の電子ブックのコンテンツを解析し、特定の用語と文字を見つけ、各用語の場所と長さをマークしています。

通常のケースは次のようなものです (ゲーム・オブ・スローンズからの抜粋):

「彼が立ち止まって下を見たとき、彼の頭はめまいがして泳ぎ、指が滑るのを感じました.

文字「ふすま」を検索する場合、その位置は 85 で、長さは 4 です。簡単です。

私の問題は、次のような段落がある場合に発生します。

<span height="-0em"><font size="7">D</font></span>aenerys Targaryen wed Khal Drogo

「Daenerys Targaryn」と一致する必要があります。HTML を取り除いて文字列を照合するのは簡単ですが、この例では、結果に HTML を含める必要があります。したがって、ここで期待される結果は、位置 = 0、長さ = 67 になります。

ランダムなアンカー タグがあちこちに散らばっているために発生する別の状況:

Did anyone outside the Vale even suspect where Catelyn <a></a>Stark had taken him?

ここでも、「Catelyn Stark」を検索するには HTML を含める必要があるため、場所 = 47、長さ = 20 です。

これらの特定のケースを追加することで一時的に回避することができました (具体的には「Catelyn <a></a> Stark」を検索します)。私の試みは RegEx を使用してきましたが、限られた成功しか収めていません.
HTML マッチング/ストリッピング (および RegEx =) を使用するかどうか) に関するさまざまな質問を見つけましたが、このケースはややユニークなようです.
タグのストリッピングはオプションではありませんコンテンツを保持する必要があるため.
これはスタンドアロンの C# アプリケーション内にあります.
アイデア、正しい方向へのステップ、または同様の例で、あなたの検索が私のものよりもうまくいった場合、大歓迎です!

4

3 に答える 3

3

考えられるアプローチの1つは、検索文字列の各文字の間に次の文字を挿入することです。

(?:<[^>]*>)*

したがって、「ふすま」という文字を検索すると、正規表現は次のようになります。

(?:<[^>]*>)*B(?:<[^>]*>)*r(?:<[^>]*>)*a(?:<[^>]*>)*n

これにより、正規表現を検索文字列内の任意の数のHTMLタグと一致させることができます。これは、検索文字列が常に文字の名前のような単純なものであり、正規表現ではない場合にのみ機能することに注意してください(a*検索文字列のように繰り返しがある場合、このメソッドは失敗します)。

于 2013-02-21T19:45:31.747 に答える
1

「Daenerys Targaryn」をパラメーターとして受け取り、最初の文字を削除する関数を作成します。次に、「aenerys Targaryn」のみを検索し、見つかった場合は「">D<」または最初の変数文字を検索します。理にかなっていますか?

例:

public static string searchFor(string str)
{
  // strip first letter of search string (in this case "D")
  // search for the rest of the string ("aenerys Targaryn")
  // if found, search for ">D<"
  // if found, search for HTML tags with "D" inside (using regex)
  // if found, search for HTML tags with the previous HTML tag in them (using regex)
  return result;
}
于 2013-02-21T20:01:15.640 に答える
0

Javascript または Php を使用すると、要素のテキストとドキュメントのテキストを取得してそこで検索し、正規表現を実行して最も近い一致 (html を含む) を返すことができます。

別のオプション:


最初に Lucene Search Engine などを使用して書籍のインデックスを作成します (たまたまさまざまな形式でインデックスを作成できます (html 形式はその 1 つです))。

その後、Lucene API を使用して、ドキュメントを少し簡単に検索できます。PHPには、この種の処理に最適なZend_Search_Luceneがあります。


Lucene 検索は、http: //lucene.apache.org/core/にあります。

楽しむ!

于 2013-02-21T19:44:50.940 に答える