在字符串中提取围绕给定搜索字符串的 X 个单词

Posted

技术标签:

【中文标题】在字符串中提取围绕给定搜索字符串的 X 个单词【英文标题】:Extract X number of words surrounding a given search string within a string 【发布时间】:2012-01-05 06:20:42 【问题描述】:

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

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

我正在使用 php

谢谢!

【问题讨论】:

这也可能对您有所帮助:***.com/q/1436582/1066234 【参考方案1】:

您可能无法使用正则表达式完全解决此问题。单词之间有太多其他字符的可能性...

但是你可以试试这个正则表达式:

((?:\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]

【讨论】:

要添加到 morja 的答案,您可以使用 PHP 的 preg_match 从 MySQL 中选择字符串:php.net/manual/en/function.preg-match.php。 谢谢,我会在今天晚些时候有机会的时候尝试一下。感谢您花时间回答这个问题! 我已经尝试过了,它有时可以在 Rubular 上运行...嗯...我尝试在 PHP 中实现它,但我似乎无法理解它...任何人都可以为我指明正确的方向?【参考方案2】:

我会将此正则表达式用于 php,它也考虑 UTF8 字符

'~(?:[\pL\pN\']+[^\pL\pN\']+)0,5<search word>(?:[^\pL\pN\']+[\pL\pN\']+)0,5~u'

在这种情况下,'~' 是分隔符,修饰符 'u' 在末尾标识正则表达式是 UTF8 解释的。

请在此处查看有关 Unicode 正则表达式标识符的文档:

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

【讨论】:

以上是关于在字符串中提取围绕给定搜索字符串的 X 个单词的主要内容,如果未能解决你的问题,请参考以下文章

2021-10-02:单词搜索。给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母

[LeetCode]Word Break

在 Bash 中提取子字符串

如何提取 MySQL 字符串中的第 n 个单词并计算单词出现次数?

文本左右对齐(字符串模拟)螺旋矩阵 II(数组矩阵)二叉树中的最大路径和(树深度优先搜索)

在字符网格中搜索单词