提取字符串中给定搜索字符串周围的X个字

时间:2011-11-24 00:39:22

标签: php mysql regex search

我正在寻找一种方法来在搜索中的给定单词的两侧提取X个单词。

例如,如果用户输入“inmate”作为搜索词并且MySQL查询在帖子的内容中找到包含“inmate”的帖子,我想不返回帖子的全部内容而只是x两边的单词数量,以便为用户提供帖子的要点,然后他们可以决定是否要继续发帖并完整阅读。

我正在使用PHP。

谢谢!

2 个答案:

答案 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标识符的文档:

http://www.regular-expressions.info/refunicode.html