PHP 在搜索短语周围得到 10 个单词



我正在尝试执行以下操作:

从文本块中抓取搜索短语之前的 5 个单词(如果只有 Y 个单词,则为 Y),搜索短语后抓取 5 个单词(如果我说单词时,我的意思是文本块中的任何单词或数字)

例如

文本块:"欢迎来到堆栈溢出!访问您的用户页面以设置您的姓名和电子邮件。

如果你要搜索"访问你的",它会返回:"欢迎来到堆栈溢出!访问您的用户页面以设置您的">

我试过用这个

$preg_safe = str_replace(" ", "s", preg_quote($search)); 
$pattern = "/(w*Ss+){0,8}S*b($preg_safe)bS*(sS+){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*Ss+){0,8}S*b($preg_safe)bS*(sS+){0,8}/i";

但它没有用。

如何使其适用于其他语言?

//////////////////编辑//////////

正如 enrico.bacis 建议的那样 - 我已将模式更改为:

$pattern = "/(wp{Hebrew}*Ss+){0,20}S*b($preg_safe)bS*(sS+){0,20}/ixu";

现在它适用于英语和希伯来语搜索短语,但是当存在特殊字符(例如')时,结果文本将被剪切。

如何使模式返回搜索短语周围的文本,即使它包含特殊字符?

您的问题在于与希伯来语字符不匹配的w,实际上w只是所谓的"单词"字符的快捷方式:[A-Za-z0-9_]

要使正则表达式能够捕获希伯来字符,您只需进行两项更改:

  • 向修饰符添加u以管理 UTF8 字符(因此您的修饰符将/ixu)

  • 为模式中出现的每次w替换[wp{Hebrew}]

您也可以在此处查看有关此主题的更多答案。

最新更新