我正在尝试执行以下操作:
在搜索短语之前抓住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";
现在它适用于英语和希伯来语搜索短语,但是当有特殊字符(例如)时,结果文本会被删除。
如果模式包含特殊字符,如何使模式返回搜索短语周围的文本?
答案 0 :(得分:1)
您的问题出现在与\w
不匹配的希伯来字符上,实际上\w
只是所谓“字”字符的快捷方式:[A-Za-z0-9_]
。
要使正则表达式能够捕获希伯来字符,您只需进行两处更改:
将u
添加到修饰符以管理UTF8字符(因此您的修饰符将为/ixu
)
在您的模式中每次出现[\w\p{Hebrew}]
时替换\w
。
您还可以查看here以获取有关此主题的更多答案。