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

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

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

我正在使用 PHP。

谢谢!

【问题讨论】:

标签: php mysql regex search


【解决方案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 字符

'~(?:[\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 正则表达式标识符的文档:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2013-10-22
    • 2011-12-27
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多