【问题标题】:PHP get 10 words around a search phrasePHP 在搜索短语周围获得 10 个单词
【发布时间】:2012-10-15 10:30:04
【问题描述】:

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

从一段文本(当我说单词时,我表示文本块中的单词或数字)

例如

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

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

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

【问题讨论】:

    标签: php regex search


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我需要它来支持希伯来语和英语,将来还会有其他语言
    • 我解释得更好,现在检查
    • 感谢您的回答。请参阅原始问题中的编辑部分
    • 您必须决定是否更容易列出要包含的“特殊字符”或要用作分隔符的字符,然后将它们包含在您的模式中。
    • 你能举例说明如何使用我想在模式中包含的“特殊字符”列表吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多