在String中查找句子的开头

时间:2008-10-10 14:11:32

标签: php regex

我想在具有标题和简短描述的网站中显示搜索查询的结果。简短描述应该是包含searchterm的页面的一小部分。我想做的是: 页面中有1个条带标签 2找到seachterm的第一个位置 3从那个位置,回去找到那个句子的开头(如果有的话)。 4从步骤3中找到的位置开始,显示从那里开始的200个字符

我需要第3步的帮助。我想我需要一个找到第一个大写或点的正则表达式...

4 个答案:

答案 0 :(得分:5)

即便如此,最终也会失败。鉴于句子“我们去了史密斯博士的办公室”,如果你的搜索词是“办公室”,那么你使用的任何标准几乎都会给你“史密斯办公室”作为你的句子。

答案 1 :(得分:2)

我会这样做,我会解析页面......

  1. 略过以'<'

  2. 开头的所有内容
  3. 遇到“。”或[A-Z],开始将其放入缓冲区,直到找到另一个“。”

  4. 如果缓冲的字符串有搜索关键字,那就是你的字符串!其他。开始缓冲“。”你遇到并重复了。

  5. 编辑:正如James Curran指出的那样,在某些情况下这种策略会失败......所以这是解决方案:

    您可以做的是从页面开头(标签后)开始X个字符

    然后搜索您的关键字,缓冲前两个单词。当你找到它时, 做这样的事情: {X} ... {prev-2} {next-2}

    示例:这个星球有 - 或者更确切地说 - 有一个问题,就是这样:生活在它上面的大多数人在很多时候都不开心。针对这个问题提出了许多解决方案,但其中大部分都主要关注小绿纸的移动,这很奇怪,因为总的来说不是那些不开心的小绿纸。

    搜索关键字:“建议”

    结果:这个星球已经 - 或者更确切地说 - 有一个问题......对于这个问题,很多解决方案 建议 ...... < / p>

答案 2 :(得分:1)

对于第3步:如果您反转结束要从后向搜索的子字符串,请获取第一个“。”的位置。并从搜索字符串的位置中删除该值。

$offset = stripos( strrev(substr($string, $searchlocation)), '.');
$startloc = $searchlocation - $offset;
$finalstring = substr($string, $startloc, 200);

这可能是1,但我认为它将完成工作。似乎应该有一个更短的方法来做到这一点。

答案 3 :(得分:1)

我认为不是试图找到句子,而是考虑我在文字中需要的搜索词的上下文量。然后向后退一定数量的单词(或开头)并转发剩余的单词数以选择其余的上下文。通过这种方式,您只需将整个语料库拆分为空白,找到该术语的第一个出现(可能使用模糊匹配来查找子标点并考虑标点符号),并应用上述算法。如果第一个未选择的术语没有以标点符号结尾等,你甚至可以创造性地介绍省略号。