PHP正则表达式,用于搜索短语周围的单词集合

PHP正则表达式,用于搜索短语周围的单词集合,php,regex,Php,Regex,嗨,我正在尝试创建一个正则表达式,它将执行以下操作 从一个文本块(当我说单词时,我指的是文本块中的单词或数字)中,在搜索短语前抓取5个单词(如果只有x个单词,则抓取x),在搜索短语后抓取5个单词(如果只有x个单词,则抓取x) 乙二醇 欢迎来到堆栈溢出!访问您的用户页面以设置您的姓名和电子邮件 如果您要搜索“访问”,它将返回: 欢迎来到堆栈溢出!访问您的用户页面以设置 我们的想法是在php中使用preg_match_all,为我提供一组搜索结果,显示每次出现搜索短语时搜索短语在文本中的位置 提前感

嗨,我正在尝试创建一个正则表达式,它将执行以下操作

从一个文本块(当我说单词时,我指的是文本块中的单词或数字)中,在搜索短语前抓取5个单词(如果只有x个单词,则抓取x),在搜索短语后抓取5个单词(如果只有x个单词,则抓取x)

乙二醇

欢迎来到堆栈溢出!访问您的用户页面以设置您的姓名和电子邮件

如果您要搜索“访问”,它将返回: 欢迎来到堆栈溢出!访问您的用户页面以设置

我们的想法是在php中使用preg_match_all,为我提供一组搜索结果,显示每次出现搜索短语时搜索短语在文本中的位置

提前感谢:D

在子注释中,可能有更好的方法来获得我的结果,如果你觉得有,请随意将其扔进池中,因为我不确定这是我第一次想到的最好的方法,要做我需要的事情:D

你可以做以下操作(这有点计算量大,因此对于很长的字符串来说效率不高):

这个怎么样:

(\S+\s+){0,5}\S*\bvisit\b\S*(\s+\S+){0,5}
将在搜索词前后匹配五个“词”(但如果文本较短,则接受较少的词)(在本例中为
访问

我将“单词”定义为一系列非空格字符,由至少一个空格分隔


搜索词应为实际词(以字母数字字符开头和结尾)。

+1用于使用实际正则表达式。但是您不需要\S*\b内容。假设您的搜索词是$keyword,“/(\S+\S+{0,5}”$关键词。”(\s+\s+{0,5}/'工作得很好。在本示例文本中不需要它。但是,如果关键字可能被空格以外的内容包围,则需要使用它。假设关键字是
Overflow
,那么您需要
(\s+\s+{0,5}\s*\boverflow\b\s*(\s+\s+{0,5}
),否则您将无法获得匹配项。谢谢您,我已完成的代码。
任何支持多个单词的编辑机会,例如“访问您的用户”,非常感谢。@Tom:这个正则表达式使用详细模式,其中忽略空白以提高可读性。这也意味着,如果要匹配包含空格的短语,则需要将其写成
visit\syour\suser
(对于任何空格)或
visit\your\user
/
visit[]your[]user
(对于实际空格字符)。
(\S+\s+){0,5}\S*\bvisit\b\S*(\s+\S+){0,5}
preg_match_all(
    '/(\S+\s+){0,5} # Match five (or less) "words"
    \S*             # Match (if present) punctuation before the search term
    \b              # Assert position at the start of a word
    visit           # Match the search term
    \b              # Assert position at the end of a word
    \S*             # Match (if present) punctuation after the search term
    (\s+\S+){0,5}   # Match five (or less) "words"
    /ix', 
    $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];