使用jQuery突出显示长句子

时间:2010-02-26 12:26:46

标签: jquery regex split paragraph text-segmentation

我想突出显示页面上一系列段落对象中包含的长句子(例如,50个字或更多),即$("#content p")。我不确定如何解决这个问题。

我最初试图突出显示所有句子,但是当它们包含HTML标记时遇到了麻烦(例如,网上的代码突出显示似乎只针对单个单词,因此它们不考虑子节点)。我知道分裂句子很难;我想用。!?然后是空格,然后是大写字母,或者根本没有任何东西(即段落的末尾)。

提前感谢您的任何帮助/建议。

4 个答案:

答案 0 :(得分:2)

正如你所说的那样,为了得到正确的事情会很棘手,因为事实是你;我不会抓住它们,我会坚持一些简单的事情:

var regex = \[^.!?]{50,}[.!?]\;

变得过于聪明,你最终会花费更多的时间来编写边缘情况,而不是我想你会合理地想要。

答案 1 :(得分:0)

我不确定最好的办法是在客户端执行此操作。我会考虑将段落发送回服务器来完成工作。但这项工作应该是相同的。

首先获取段落的所有内容,确保在DOM中的几个节点中获取所有内容。 (Read This)然后,您需要创建一个解析器来查找您的拆分字符,同时在HTML实体中忽略它们。

作为一个例子。在href属性中应该忽略而不是拆分。在进行解析时,您可以保持字数以及在空间上工作。使每个句子成为包含整个句子和单词计数的对象。因此,您可以将这些对象推送到表示段落的数组中。完成后,如果字数达到阈值,您可以遍历数组并在一个范围内包装任何句子,以便用CSS突出显示。

主要问题是标签可能是两个句子的一部分,如下所示。

I'm typing <b> in bold. NOW!</b>

我所谈到的内容并没有解决这个问题,但是你可以在以后使解析器更加复杂以支持它。

快速浏览我漫无穷大的解析所有角色的状态机,处理计算单词并在正确的位置分割。在拆分时,将收集的数据添加到数组中。完成迭代后,输出新包装的句子。

答案 2 :(得分:0)

这可能是一个相当缓慢的解决方案,也很难看,但编码应该非常简单:

将所有文本读入一个字符串,然后解析它,计算字符并查找每个。!? - 字符。在解析循环中,您还可以查找&lt;和&gt;,其中&lt;意思是“忽略所有。!?直到找到另一个&gt;”。然后每当你找到一个。!? - 字符时,你会检查自上一个字符以来的长度,如果它足够长,你可以将起点和终点的索引保存到数组中。

完成整个操作后,再创建一个循环,将第一个字符串中的子字符串移动到一个新字符串中,在每个“长句”前加上一个高亮标记,并在末尾添加一个结束高亮标记。它,继续前进。

完成后,将新字符串放回原处...

答案 3 :(得分:0)

要执行此操作,您需要获取每个段落的HTML(node.html()),然后使用相同数量的空格替换所有HTML标记。这应该是相当直接的,因为你可以只寻找开口角度支架和第一个右括号。您需要首先执行此操作以防止标记内的任何完全停止和单词混淆算法的其余部分,还要防止标记本身被计为单词。

根据句号拆分文本,后跟任何内容或任何数量的空格来获取句子。您需要使用匹配的正则表达式手动执行此拆分,以便您可以跟踪原始字符串中句子的开始和结束位置。

接下来在空格上拆分每个句子,并从数组中删除任何只包含空格的“单词”。这给你句子的长度。如果它超出了您的限制,则在原始HTML字符串中的句子的开始和结束位置插入适当的HTML。您需要跟踪已添加的额外HTML数量,以便找到后续长句的正确开始和结束位置。