将字符串修剪为忽略 HTML 的长度
这个问题是一个具有挑战性的问题。 我们的应用程序允许用户在主页上发布新闻。 该新闻是通过允许 HTML 的富文本编辑器输入的。 在主页上,我们只想显示新闻项目的截断摘要。
例如,这是我们显示的全文,包括 HTML
为了在办公室和厨房腾出更多空间,我随机拿出了所有杯子并将它们放在午餐室的桌子上。 除非您对 1992 年的 Cheyenne Courier 马克杯或 1997 年的 BC Tel Advanced Communications 马克杯的所有权有强烈的感觉,否则它们将被放入盒子中并捐赠给比我们更需要马克杯的办公室。
我们希望将新闻项目修剪为 250 个字符,但排除 HTML。
目前我们使用的修剪方法包括 HTML,这会导致一些 HTML 较多的新闻帖子被大幅截断。
例如,如果上面的示例包含大量 HTML,它可能如下所示:
为了在办公室、厨房腾出更多空间,我拉了......
这不是我们想要的。
有没有人有办法标记 HTML 标签,以便保持字符串中的位置,对字符串执行长度检查和/或修剪,并将字符串内的 HTML 恢复到其旧位置?
This problem is a challenging one. Our application allows users to post news on the homepage. That news is input via a rich text editor which allows HTML. On the homepage we want to only display a truncated summary of the news item.
For example, here is the full text we are displaying, including HTML
In an attempt to make a bit more space in the office, kitchen, I've pulled out all of the random mugs and put them onto the lunch room table. Unless you feel strongly about the ownership of that Cheyenne Courier mug from 1992 or perhaps that BC Tel Advanced Communications mug from 1997, they will be put in a box and donated to an office in more need of mugs than us.
We want to trim the news item to 250 characters, but exclude HTML.
The method we are using for trimming currently includes the HTML, and this results in some news posts that are HTML heavy getting truncated considerably.
For instance, if the above example included tons of HTML, it could potentially look like this:
In an attempt to make a bit more space in the office, kitchen, I've pulled...
This is not what we want.
Does anyone have a way of tokenizing HTML tags in order to maintain position in the string, perform a length check and/or trim on the string, and restore the HTML inside the string at its old location?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
从帖子的第一个字符开始,跨过每个字符。 每次你跨过一个角色时,都会增加一个计数器。 当你找到“<”时 字符,停止增加计数器,直到您点击“>” 特点。 当计数器达到 250 时,你的位置就是你真正想要切断的位置。
请注意,当 HTML 标记打开但在截止之前未关闭时,您将不得不处理另一个问题。
Start at the first character of the post, stepping over each character. Every time you step over a character, increment a counter. When you find a '<' character, stop incrementing the counter until you hit a '>' character. Your position when the counter gets to 250 is where you actually want to cut off.
Take note that this will have another problem that you'll have to deal with when an HTML tag is opened but not closed before the cutoff.
遵循 2 状态有限机建议,我刚刚为此目的用 Java 开发了一个简单的 HTML 解析器:
http:// Pastebin.com/jCRqiwNH
这里有一个测试用例:
http://pastebin.com/37gCS4tV
并且这里是 Java 代码:
}
Following the 2-state finite machine suggestion, I've just developed a simple HTML parser for this purpose, in Java:
http://pastebin.com/jCRqiwNH
and here a test case:
http://pastebin.com/37gCS4tV
And here the Java code:
}
您可以尝试以下 npm 包
trim-html
它会切断 html 标签内的足够文本,保存原始 html 限制,达到限制后删除 html 标签并关闭打开的标签。
You can try the following npm package
trim-html
It cutting off sufficient text inside html tags, save original html stricture, remove html tags after limit is reached and closing opened tags.
如果我正确理解问题,您希望保留 HTML 格式,但不希望将其计入您保留的字符串长度的一部分。
您可以使用实现简单有限状态机的代码来完成此任务。
您的起始状态将为 OutOfTag。
您可以通过一次处理 1 个字符来实现有限状态机。 每个角色的处理都会带你进入一个新的状态。
当您通过有限状态机运行文本时,您还希望保留输出缓冲区和到目前为止遇到的变量的长度(以便您知道何时停止)。
If I understand the problem correctly, you want to keep the HTML formatting, but you want to not count it as part of the length of the string you are keeping.
You can accomplish this with code that implements a simple finite state machine.
Your starting state will be OutOfTag.
You implement a finite state machine by procesing 1 character at a time. The processing of each character brings you to a new state.
As you run your text through the finite state machine, you want to also keep an output buffer and a length so far encountered varaible (so you know when to stop).
这是我在 C# 中提出的实现:
以及我通过 TDD 使用的一些单元测试:
Here's the implementation that I came up with, in C#:
And a few unit tests I used via TDD:
我知道这已经是发布日期之后很久了,但我遇到了类似的问题,这就是我最终解决它的方法。 我担心的是正则表达式与通过数组进行交互的速度。
另外,如果 html 标签之前有一个空格,而在这之后并不能解决这个问题
I'm aware this is quite a bit after the posted date, but i had a similiar issue and this is how i ended up solving it. My concern would be the speed of regex versus interating through an array.
Also if you have a space before an html tag, and after this doesn't fix that
最快的方法不是使用 jQuery 的
text()
方法吗?例如:
将在
text
变量中给出值 OneTwoThree。 这将允许您获取不包含 HTML 的文本的实际长度。Wouldn't the fastest way be to use jQuery's
text()
method?For example:
Would give the value OneTwoThree in the
text
variable. This would allow you to get the actual length of the text without the HTML included.