我正在寻找一种方法来在搜索中的给定单词的两侧提取X个单词。
例如,如果用户输入“inmate”作为搜索词并且MySQL查询在帖子的内容中找到包含“inmate”的帖子,我想不返回帖子的全部内容而只是x两边的单词数量,以便为用户提供帖子的要点,然后他们可以决定是否要继续发帖并完整阅读。
我正在使用PHP。
谢谢!
答案 0 :(得分:9)
您可能无法使用正则表达式完全解决此问题。单词之间有太多其他字符的可能性......
但你可以试试这个正则表达式:
((?:\S+\s*){0,5}\S*inmate\S*(?:\s*\S+){0,5})
见这里:rubular
您可能还想排除某些字符,因为它们不算作单词。现在,正则表达式将空格包围的任何非空格字符序列计为单词。
仅匹配真实的单词:
((?:\w+\s*){0,5}<search word>(?:\s*\w+){0,5})
但是这里任何非单词字符(,“。等)都会对匹配进行制动。
所以你可以继续......
((?:[\w"',.-]+\s*){0,5}["',.-]?<search word>["',.-]?(?:\s*[\w"',.-]+){0,5})
这也会在搜索字词周围匹配5个单词和“',. - 之一。
在php中使用它:
$sourcestring="For example, if a user enters \"inmate\" as a search word and the MySQL";
preg_match_all('/(?:\S+\s*){0,5}\S*inmate\S*(?:\s*\S+){0,5}/s',$sourcestring,$matches);
echo $matches[0][0]; // you might have more matches, they will be in $matches[0][x]
答案 1 :(得分:1)
我会使用这个正则表达式的php,它也考虑UTF8字符
'~(?:[\p{L}\p{N}\']+[^\p{L}\p{N}\']+){0,5}<search word>(?:[^\p{L}\p{N}\']+[\p{L}\p{N}\']+){0,5}~u'
在这种情况下,'〜'是分隔符,末尾的修饰符'u'标识正则表达式是UTF8解释。
请在此处查看有关Unicode Regex标识符的文档: