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

时间:2012-10-25 09:09:11

标签: php regex search

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

在搜索短语之前抓住5个单词(如果那里只有Y个单词则为Y),在搜索短语之后抓取5个单词(或者如果只有Y个单词则为Y)从一个文本块中抓取(当我说出单词I时意思是文字块中的单词或数字。

例如

文本块:“欢迎使用Stack Overflow!访问您的用户页面以设置您的姓名和电子邮件。”

如果您要搜索“访问您的”,它将返回:“欢迎使用Stack Overflow!访问您的用户页面以设置您的”

我尝试过使用此

$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";

现在它适用于英语和希伯来语搜索短语,但是当有特殊字符(例如)时,结果文本会被删除。

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

1 个答案:

答案 0 :(得分:1)

您的问题出现在与\w不匹配的希伯来字符上,实际上\w只是所谓“字”字符的快捷方式:[A-Za-z0-9_]

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

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

  • 在您的模式中每次出现[\w\p{Hebrew}]时替换\w

您还可以查看here以获取有关此主题的更多答案。