在PHP中,使用“从MySQL搜索结果中获取整个单词”;例如;

在PHP中,使用“从MySQL搜索结果中获取整个单词”;例如;,php,mysql,regex,search,Php,Mysql,Regex,Search,我想要的是: 让我们假设我使用如下查询搜索了“goo:…其中像“%goo%”这样的消息返回了一个结果,例如我喜欢谷歌进行搜索,但我开始担心隐私,因此它将显示为结果,因为谷歌这个词符合我的搜索条件 如何根据搜索字符串将整个Google结果保存在变量上? 我需要这样做,因为我使用的正则表达式将突出显示搜索的单词,并在结果前后显示内容,但它只有在搜索的单词与结果中的单词完全匹配时才起作用,而且它的构造也不正确,因此它不能很好地处理没有空格的单词 这是正则表达式代码 <?=preg_replace

我想要的是: 让我们假设我使用如下查询搜索了“goo:
…其中像“%goo%”这样的消息
返回了一个结果,例如
我喜欢谷歌进行搜索,但我开始担心隐私
,因此它将显示为结果,因为
谷歌
这个词符合我的搜索条件

如何根据搜索字符串将整个
Google
结果保存在变量上? 我需要这样做,因为我使用的正则表达式将突出显示搜索的单词,并在结果前后显示内容,但它只有在搜索的单词与结果中的单词完全匹配时才起作用,而且它的构造也不正确,因此它不能很好地处理没有空格的单词

这是正则表达式代码

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

我想要的是将这个$\u GET['s']更改为我的变量,该变量将包含在查询字符串中找到的整个单词


如何实现这一点?

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

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

我不明白匹配搜索字符串中其他所有内容的重要性,这难道还不够吗

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

据我所知,您只是将匹配的单词放入html标记中,而不对字符串的其余部分做任何操作

上述正则表达式适用于只匹配整词、捕获字符串中的多个匹配项(如果有多个匹配项)以及不区分大小写的情况。

I read和更健壮的实现可能是合适的。特别是考虑到你对支持的需求。使用一个正则表达式来解决所有问题可能看起来很诱人,但它越复杂,维护或扩展就越困难。引用

有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题

由于我在本地机器上遇到问题,我使用了一个更简单的实现,如果您的情况需要,请随意使用

在这个解决方案中,我使用一个简单的正则表达式来获取一组字母数字字符(也称为“单词”),正则表达式中读取
\p{L}\p{M}
的部分确保我们也可以使用

你可以看到


我认为要让它按预期工作,我不仅要检查任何包含该术语的单词,还要在REGEX中模拟所有类似MySQL的功能(不区分大小写、特殊字符等),我认为我无法做到这一点,怎么会这样?我更改了表达式adding/I修饰符使其不区分大小写,并将\w*替换为。*以匹配任何字符,我认为这应该(几乎)起作用。情况变得更糟:(现在,在一些结果中,它将匹配的单词前后的许多单词包装到强标记中,而在其他结果中,它不会包装任何内容。在我上次编辑时,我用这些问号(.*)做了一个懒散的标记。希望这次它真的有效:)让我们再次尝试使用除空格以外的所有内容…:我认为换行括号没有多大用处(如果我没记错的话,您可以在PHP中使用
$0
)。但是,是的,似乎是最简单的解决方案。@Loamhoof是的,您是对的。这只是我简化后的一部分。关于
\B*
不起作用(我已经阅读了您的讨论),这是正常的。
\B
(就像
\B
)匹配一个位置(不是单词边界)。你可以重复一个字符,但重复一个位置是没有意义的。你使用的utf_解码方法不包括丹麦、瑞典和挪威使用的æåÆØØØ。这不是一个潜在的问题吗?@melwil是的,这将证明是一个问题,因此我建议读者使用更复杂或更健壮的impl如果情况需要,请进行校正。如果您有一个稳定的开发环境(即镜像您的生产服务器的环境),您可以使用
iconv
来翻译字符。否则您将需要。为了好玩(并给您一个更准确的示例)我已经更新了我的答案,加入了你提到的人物。
<?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;
?>