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

4

我敢打赌,更改正则表达式以检查包含该术语的任何单词会更容易,那么:

<?=preg_replace('/^.*?(.{0,'.$size.'})(\b\S*'.$_GET['s'].'\S*\b)(.{0,'.$size.'}).*?$/i',
            '...$1<strong>$2</strong>$3...',$message);?>
于 2013-04-17T18:27:19.290 回答
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 回答