0

私は次のことをしようとしています:

テキストのブロックから、検索フレーズの前の 5 単語 (Y 単語しかない場合は Y) と検索フレーズの後の 5 単語 (または Y 単語しかない場合は Y) を取得します (単語を言うとき、単語を意味するか、テキストのブロックにあるものは何でも番号)

例えば

テキストのブロック: 「Stack Overflow へようこそ! ユーザー ページにアクセスして、名前と電子メールを設定してください。」

"visit your" を検索すると、"Welcome to Stack Overflow! Visit your user page to set your" が返されます。

私はこれを使ってみました

$preg_safe = str_replace(" ", "\s", preg_quote($search)); 
$pattern = "/(\w*\S\s+){0,8}\S*\b($preg_safe)\b\S*(\s\S+){0,8}/ix";
if(preg_match_all($pattern, $full_text, $matches))
{ 
    $result = str_replace(strtolower($search), "<span class='searched-for'>$search</span>", strtolower($matches[0][0])); 
}
else
{ 
    $result = false; 
}

検索フレーズが英語の場合は機能しますが、他の言語でも機能する必要があります。たとえば、ヘブライ語の検索フレーズでは機能しません。

パターンを次のように変更しようとしました:

$pattern = "(*UTF8)/(\w*\S\s+){0,8}\S*\b($preg_safe)\b\S*(\s\S+){0,8}/i";

しかし、うまくいきませんでした。

他の言語で機能させるにはどうすればよいですか?

////////////////// 編集 //////////

enrico.bacis が示唆したように、パターンを次のように変更しました。

$pattern = "/(\w\p{Hebrew}*\S\s+){0,20}\S*\b($preg_safe)\b\S*(\s\S+){0,20}/ixu";

英語とヘブライ語の検索フレーズで機能するようになりましたが、特殊文字 (' など) があると結果テキストが切り取られます。

特殊文字が含まれている場合でも、検索フレーズの周囲のテキストを返すパターンを作成するにはどうすればよいですか?

4

1 に答える 1

1

あなたの問題は、\wヘブライ文字と一致しない にあります。実際に\wは、いわゆる「単語」文字のショートカットにすぎません: [A-Za-z0-9_].

正規表現でヘブライ文字もキャプチャできるようにするには、2 つの変更を加えるだけで済みます。

  • UTF8 文字を管理するために修飾子に追加uします (そのため、修飾子は になります/ixu)

  • [\w\p{Hebrew}]パターン内のすべての出現を置き換え\wます。

このトピックに関するその他の回答については、こちらを確認することもできます。

于 2012-10-25T09:19:08.350 に答える