0

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

从文本块(当我说单词时,我的意思是单词或文本块中的数字)

例如

文本块:“欢迎使用 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";

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

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

4

1 回答 1

1

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

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

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

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

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

于 2012-10-25T09:19:08.350 回答