【问题标题】:function that highlight a word and extract the text near it突出显示单词并提取其附近文本的功能
【发布时间】:2011-12-15 09:26:29
【问题描述】:

我有一个文本例如:

Etiam porta sem malesuada magna mollis euismod。整数值 前 venenatis dapibus posuere velit aliquet。 Etiam porta sem malesuada magna mollis euismod。 Aenean eu leo quam。佩伦特斯克 ornare sem lacinia quam venenatis 前庭。 Fusce dapibus,tellus ac cursus commodo,tortor mauris condimentum nibh,ut 发酵马萨 justo sit amet risus.

Nulla vitae elit libero,一个 pharetra augue。前庭 id 舌门 felis euismod semper。前庭 id ligula porta felis euismod semper。 Maecenas sed diam eget risus varius blandit sat amet non magna。 前庭 id ligula porta felis euismod semper。整数型 a ante venenatis dapibus posuere velit aliquet。

Cras mattis consectetur purus 坐在一起发酵。 Etiam porta sem malesuada magna mollis euismod。 Praesent commodo cursus magna, vel scelerisque nisl consectetur 等Maecenas faucibus mollis interdum。 Nullam quis risus eget urna mollis ornare vel eu leo。

该文本显示为在我的网站中执行的搜索的描述,我希望能够突出显示一个单词/字符串并提取它旁边的文本。

我不确定最好的方法是 php(可能是)还是只使用 jquery 函数。我知道如何在 jQuery 中突出显示一个单词,但不知道如何提取文本。

在此示例中,我想显示为描述,因为我搜索的字符串是“consectetur purus”以下文本。

....posuere velit aliquet.Cras mattis consectetur purus 坐在一起 发酵菌。埃蒂亚姆门....

如您所见,我不仅显示突出显示的单词,而且还显示它之前和之后的一些文本。 实现这一目标的最佳方法是什么?

我在我的网站中使用 swish-e 库作为搜索引擎,我的 cgi 知识为空,所以我更喜欢尝试 php 方式。

非常感谢您的帮助

【问题讨论】:

  • str_replace($word,"$word",$result) ?
  • 但这仍然会返回整个文本,我只是想提取它的摘要。匹配的单词前后可能有 10 个单词/100 个字符。

标签: php javascript jquery regex


【解决方案1】:

我们为此创建了一个小库。它将突出显示您提到的单词,并为您提供查询词周围的句子摘录。

$lorumIpsum = "three paragraps of lrum ipsum";
TextSnippet::createSnippet('Lorem', $lorumIpsum);

这将产生以下文本:

Lorem ipsum dolor sit amet,consectetur adipiscing elit。 ... Etiam bibendum lorem nec tempus sollicitudin。 ... dapibus lorem 中的 Sed。 ... Nunc turpis ipsum、bibendum quis sodales sed、ullamcorper et lorem。 Donec et metus hendrerit, interdum elit ut, dignissim dui。

该类还支持设置html标签以突出显示,以及设置sn-p的最小和最大单词。

请参阅 Github 上的 swisnl/textsnippet

【讨论】:

    【解决方案2】:

    在 php 中使用正则表达式(不过,您可以在 JavaScript 中做同样的事情)。

    $regex = '/([A-Za-z0-9.,-]+\s*){0,5}\sconsectetur purus(\s|[,.!?])(\s*[A-Za-z0-9.,-]+){0,5}/';
    preg_match($regex, $content, $matches);
    echo $matches[0];
    

    这匹配使用字母数字字符或 .,- 之一(微调此)构建的 0-5 个单词,然后是您要查找的单词(末尾有或没有标点符号),然后是 0-5 个单词。这永远不会在中间打断一个单词,因为达到了一定数量的字符。

    输出:

    posuere velit aliquet.

    Cras mattis consectetur purus sat amet 发酵。埃蒂亚姆门

    现在您可以对此进行微调,例如删除\n,添加...,突出显示consectetur purus...

    【讨论】:

    • 非常感谢这成功了。让我问你如果这个词在文本中出现不止一次我该怎么办。然后我可以提取所有部分以显示它们吗?
    • @chifliiiii 你可能想看看 preg_match_all
    • @chifliiiii 我改进了正则表达式以允许在查询末尾使用标点符号:)
    • 似乎在上次更新中出现了问题,因为它不再返回值。刚刚在writecodeonline.com/php 中尝试过同样的例子
    • 抱歉,我不知道为什么它在我的网站上的 writecodeonline 上不起作用,因为我正在编写像“consectur”这样的搜索,但在文本上是“Consectur”。有什么办法可以匹配上或下吗?
    【解决方案3】:

    这取决于您在搜索请求后如何获得答案以及搜索引擎的工作方式。

    如果您的目标是“键入”搜索,例如“Google”,那么最好通过 php 来减少传输的数据并浪费更少的流量。

    否则,如果您将整个文本作为响应并且不介意负载 - 使用 JS 使用 RegExp 或计数 string.charAt( int )

    【讨论】:

    • 是的,它已经按照您的想法加载了文本。你能告诉我如何用 javascript 来做吗?
    • var x = x.replace( "([\S ]{,INT_CHARS_TO_LEFT})" + word + "([\S ]{,INT_CHARS_TO_RIGHT})" , "...$1" + 单词 + "$2..." );
    • @chifliiiii 或者,查看我在答案中发布的正则表达式。
    • @Michael:对 StackOverflow 的评论就是这样的:cmets。即使您使用了代码格式(在 cmets 中 支持,尽管非常有限),该代码对于评论来说还是太多了。当您想扩展答案时,只需对其进行编辑并添加新信息。欢迎来到 SO!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多