4

私が望むのは、次のようなクエリを使用して「goo」を検索したとしましょう。...WHERE message LIKE '%goo%'たとえばI love Google to make my searches, but I'm starting to worry about privacy、結果が返されたので、単語がGoogle検索基準に一致するため、結果として表示されます。

検索文字列に基づいて、このGoogle結果全体を変数に保存するにはどうすればよいですか? 検索された単語を強調表示し、この結果の前後にコンテンツを表示する正規表現を使用しているため、これが必要ですが、検索された単語が結果の単語と正確に一致する場合にのみ機能し、構造が正しくないため、勝ちましたスペースで囲まれていない単語ではうまく機能しません。

これは正規表現コードです

<?=preg_replace('/^.*?\s(.{0,'.$size.'})(\b'.$_GET['s'].'\b)(.{0,'.$size.'})\s.*?$/',
            '...$1<strong>$2</strong>$3...',$message);?>

私が望むのは、この $_GET['s'] を、クエリ文字列で見つかった単語全体を含む変数に変更することです。

どうすればこれを達成できますか?

4

3 に答える 3

2

これに関するあなたの議論を読みましたが、より堅牢な実装が必要になるかもしれません。特に分音記号をサポートする必要性を考慮してください。単一の正規表現を使用してすべての問題を解決するのは魅力的に思えるかもしれませんが、複雑になればなるほど、保守や拡張が難しくなります。ジェイミー・ザウィンスキーを引用する

問題に直面したときに、「分かった、正規表現を使用する」と考える人もいます。現在、彼らには 2 つの問題があります。

ローカル マシンで問題が発生しiconvたため、代わりに、より単純な実装を使用しました。状況に応じて、より複雑または堅牢なものを自由に使用してください。

このソリューションでは単純な正規表現を使用して、一連の英数字のみ (「単語」とも呼ばれます) を取得します。正規表現で読み取られる部分により、すべてのマルチバイト文字\p{L}\p{M}も確実に取得されます。

このコードが IDEone で動作していることを確認できます。

<?php
function stripAccents($p_sSubject) {
    $sSubject = (string) $p_sSubject;

    $sSubject = str_replace('æ', 'ae', $sSubject);
    $sSubject = str_replace('Æ', 'AE', $sSubject);

    $sSubject = strtr(
          utf8_decode($sSubject)
        , utf8_decode('àáâãäåçèéêëìíîïñòóôõöøùúûüýÿÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝ')
        , 'aaaaaaceeeeiiiinoooooouuuuyyAAAAAACEEEEIIIINOOOOOOUUUUY'
    );


    return $sSubject;
}

function emphasiseWord($p_sSubject, $p_sSearchTerm){

    $aSubjects = preg_split('#([^a-z0-9\p{L}\p{M}]+)#iu', $p_sSubject, null, PREG_SPLIT_DELIM_CAPTURE);

    foreach($aSubjects as $t_iKey => $t_sSubject){
        $sSubject = stripAccents($t_sSubject);
        
        if(stripos($sSubject, $p_sSearchTerm) !== false || mb_stripos($t_sSubject, $p_sSearchTerm) !== false){
            $aSubjects[$t_iKey] = '<strong>' . $t_sSubject . '</strong>';
        }
    }

    $sSubject = implode('', $aSubjects);
    
    return $sSubject;
}


/////////////////////////////// Test \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
$aTest = array(
      'goo' => 'I love Google to make my searches, but I`m starting to worry about privacy.'
    , 'peo' => 'people, People, PEOPLE, peOple, people!, people., people?, "people, people" péo'
    , 'péo' => 'people, People, PEOPLE, peOple, people!, people., people?, "people, people" péo'
    , 'gen' => '"gente", "inteligente", "VAGENS", and "Gente" ...vocês da física que passam o dia protegendo...'
    , 'voce' => '...vocês da física que passam o dia protegendo...'
    , 'o' => 'Characters like æ,ø,å,Æ,Ø and Å are used in Denmark, Sweden and Norway'
    , 'ø' => 'Characters like æ,ø,å,Æ,Ø and Å are used in Denmark, Sweden and Norway'
    , 'ae' => 'Characters like æ,ø,å,Æ,Ø and Å are used in Denmark, Sweden and Norway'
    , 'Æ' => 'Characters like æ,ø,å,Æ,Ø and Å are used in Denmark, Sweden and Norway'
);

$sContent = '<dl>';
foreach($aTest as $t_sSearchTerm => $t_sSubject){
    $sContent .= '<dt>' . $t_sSearchTerm . '</dt><dd>' . emphasiseWord($t_sSubject, $t_sSearchTerm) .'</dd>';
}
$sContent .= '</dl>';

echo $sContent;
?>
于 2013-04-23T12:40:03.937 に答える
0

検索文字列内の他のすべてのものと一致させることの重要性がわかりません。これで十分ではないでしょうか?

<?=preg_replace('/\b\S*'.$GET['s'].'\S*\b/i', '<strong>$0</strong>', $message);?>

私が知る限り、一致した単語を html タグに入れているだけで、残りの文字列には何もしていませんか?

上記の正規表現は、単語全体のみを照合し、文字列内に複数の一致をキャプチャし (複数ある必要があります)、大文字と小文字を区別しない場合でも正常に機能します。

于 2013-04-20T17:10:26.853 に答える