您好我正在尝试创建一个将执行以下操作的正则表达式
在搜索短语之前抓取5个单词(如果那里只有x个单词则为x),在搜索短语之后抓取5个单词(或者如果只有x个单词则为x)从一个文本块中抓取(当我说出单词I时意思是文字块中的单词或数字。
例如
欢迎使用Stack Overflow!访问您的用户页面以设置您的姓名和电子邮件。
如果您要搜索“访问”,它将返回: 欢迎来到Stack Overflow!访问您的用户页面以设置
这个想法是在php中使用preg_match_all给我一堆搜索结果,显示搜索短语每次出现时在文本中出现的位置。
提前致谢:D
在子笔记上可能有一个更好的方法来获得我的结果,如果你觉得有请随意把它扔进游泳池,因为我不确定这是我认为的第一种方式是最好的,做我需要的:D
答案 0 :(得分:8)
这个怎么样:
(\S+\s+){0,5}\S*\bvisit\b\S*(\s+\S+){0,5}
将匹配搜索词之前和之后的五个“单词”(但文字较短时接受较少)(在本例中为visit
)。
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];
我将“单词”定义为非空格字符序列,由至少一个空格分隔。
搜索词应该是实际的词(以字母数字字符开头和结尾)。
答案 1 :(得分:1)
您可以执行以下操作(它的计算量很大,因此对于很长的字符串来说效率不高):
<?php
$phrase = "Welcome to Stack Overflow! Visit your user page to set your name and email.";
$keyword = "Visit";
$lcWords = preg_split("/\s/", strtolower($phrase));
$words = preg_split("/\s/", $phrase);
$wordCount = 5;
$position = array_search(strtolower($keyword), $lcWords);
$indexBegin = max(array($position - $wordCount, 0));
$len = min(array(count($words), $position - $indexBegin + $wordCount + 1));
echo join(" ", array_slice($words, $indexBegin, $len));
//prints: Welcome to Stack Overflow! Visit your user page to set