如何根据字数拆分文本
How to split text depending on word count
我正在尝试使用 discord.js
、cheerio
和名为 genius.com
的网站制作歌词项目。
我已经成功地找到了一种从网站上抓取歌词的方法,我到了需要拆分它的部分,因为 discord 的最大字数限制为 2000。
我可以通过做lyrics.length
来检查整个歌词中有多少characters/words,我只需要找到一种方法来拆分字符串并发送两者,将来我可能会实现richEmbeds
到让它更时尚,但现在我专注于基础知识。
var request = require('request');
var cheerio = require('cheerio');
/*
This is a project for my discord bot, the reason for the 2000 word limit is because
discords character limit is currently set to 2000, this means that i will have to add
a function to split the lyrics and send each part
*/
//Define the URL that we are going to be scraping the data from
var UR_L = "https://genius.com/Josh-a-and-jake-hill-not-afraid-of-dying-lyrics";
//send a request to the website and return the contents of the website
request(UR_L, function(err, resp, body) {
//load the website using cheerio
$ = cheerio.load(body);
//define lyrics as the selector to text form
var lyrics = $('p').text();
if (lyrics.length > "2000" && lyrics.length < "4000") {
} else if (lyrics.length > "4000" && lyrics.length < "6000") {
} else {
//send the lyrics as one message
}
})
您可以在 repl.it 运行 here 上找到实时版本。
您可以使用.split( )
Javascript 功能。
word_list = lyrics.split(" ")
和 word_list.length
访问消息中的字数,word_list[0]
到 select 例如第一个字。
Discord has a 2000 characters limit 不是 2000 字的限制。
您的问题的一个解决方案可能是:
// This will result in an array with strings of max 2000 length
const lyricsArr = lyrics.match(/.{1,2000}/g);
lyricsArr.forEach(chunk => sendMessage(chunk))
鉴于发送消息的异步性质,您可能需要查看 p-iteration 等模块以确保块以正确的顺序到达。
也就是说,有 APIs 用于获取歌曲的歌词,我建议使用它而不是抓取。以 apiseeds 歌词 API 为例。
更新
const lyrics = 'These are my lyrics';
const lyricsArr = lyrics.match(/.{1,8}/g);
console.log(lyricsArr); // [ 'These ar', 'e my lyr', 'ics' ]
lyricsArr.forEach((chunk, i) => {
// Break if this is the last chunk.
if (i == lyricsArr.length -1) {
return;
}
// If last character is not a space, we split a word in two.
// Add additional non-wordbreaking symbols between the slashes (in the regex) if needed.
if (!chunk[chunk.length - 1].match(/[ ,.!]/)) {
const lastWord = chunk.match(/\s([^ .]+)$/)
lyricsArr[i + 1] = lastWord[1] + lyricsArr[i + 1];
lyricsArr[i] = lyricsArr[i].split(/\s[^ .]*$/)[0];
}
})
console.log(lyricsArr) // [ 'These', 'are my', 'lyrics' ]
根据评论更新。
这是一些粗略的代码,我没有花太多时间在上面,但它完成了工作。
使用此方法时的一些信息:
- 您需要在第二个 if
的正则表达式中添加任何不应被视为断字的符号
- 这还没有经过全面测试,所以使用风险自负。
- 如果歌词中有一个词长于块大小,它肯定会崩溃。因为这是2000年左右,我想应该不会有问题。
- 这将不再确保块长度低于限制,因此将限制更改为 1900 左右 以确保安全
您不需要使用任何花哨的功能,该功能已内置于 discord.js:您可以将一些选项附加到消息中,MessageOptions.split
就是您要搜索的内容.当你想发送文本时,这样做:
channel.send(lyrics, { split: true });
如果 lyrics.length
大于限制,discord.js 将剪切您的消息并一个接一个地发送,使其看起来像只有一个。
channel
是您要将消息发送到的 TextChannel
。
我正在尝试使用 discord.js
、cheerio
和名为 genius.com
的网站制作歌词项目。
我已经成功地找到了一种从网站上抓取歌词的方法,我到了需要拆分它的部分,因为 discord 的最大字数限制为 2000。
我可以通过做lyrics.length
来检查整个歌词中有多少characters/words,我只需要找到一种方法来拆分字符串并发送两者,将来我可能会实现richEmbeds
到让它更时尚,但现在我专注于基础知识。
var request = require('request');
var cheerio = require('cheerio');
/*
This is a project for my discord bot, the reason for the 2000 word limit is because
discords character limit is currently set to 2000, this means that i will have to add
a function to split the lyrics and send each part
*/
//Define the URL that we are going to be scraping the data from
var UR_L = "https://genius.com/Josh-a-and-jake-hill-not-afraid-of-dying-lyrics";
//send a request to the website and return the contents of the website
request(UR_L, function(err, resp, body) {
//load the website using cheerio
$ = cheerio.load(body);
//define lyrics as the selector to text form
var lyrics = $('p').text();
if (lyrics.length > "2000" && lyrics.length < "4000") {
} else if (lyrics.length > "4000" && lyrics.length < "6000") {
} else {
//send the lyrics as one message
}
})
您可以在 repl.it 运行 here 上找到实时版本。
您可以使用.split( )
Javascript 功能。
word_list = lyrics.split(" ")
和 word_list.length
访问消息中的字数,word_list[0]
到 select 例如第一个字。
Discord has a 2000 characters limit 不是 2000 字的限制。
您的问题的一个解决方案可能是:
// This will result in an array with strings of max 2000 length
const lyricsArr = lyrics.match(/.{1,2000}/g);
lyricsArr.forEach(chunk => sendMessage(chunk))
鉴于发送消息的异步性质,您可能需要查看 p-iteration 等模块以确保块以正确的顺序到达。
也就是说,有 APIs 用于获取歌曲的歌词,我建议使用它而不是抓取。以 apiseeds 歌词 API 为例。
更新
const lyrics = 'These are my lyrics';
const lyricsArr = lyrics.match(/.{1,8}/g);
console.log(lyricsArr); // [ 'These ar', 'e my lyr', 'ics' ]
lyricsArr.forEach((chunk, i) => {
// Break if this is the last chunk.
if (i == lyricsArr.length -1) {
return;
}
// If last character is not a space, we split a word in two.
// Add additional non-wordbreaking symbols between the slashes (in the regex) if needed.
if (!chunk[chunk.length - 1].match(/[ ,.!]/)) {
const lastWord = chunk.match(/\s([^ .]+)$/)
lyricsArr[i + 1] = lastWord[1] + lyricsArr[i + 1];
lyricsArr[i] = lyricsArr[i].split(/\s[^ .]*$/)[0];
}
})
console.log(lyricsArr) // [ 'These', 'are my', 'lyrics' ]
根据评论更新。 这是一些粗略的代码,我没有花太多时间在上面,但它完成了工作。
使用此方法时的一些信息:
- 您需要在第二个 if 的正则表达式中添加任何不应被视为断字的符号
- 这还没有经过全面测试,所以使用风险自负。
- 如果歌词中有一个词长于块大小,它肯定会崩溃。因为这是2000年左右,我想应该不会有问题。
- 这将不再确保块长度低于限制,因此将限制更改为 1900 左右 以确保安全
您不需要使用任何花哨的功能,该功能已内置于 discord.js:您可以将一些选项附加到消息中,MessageOptions.split
就是您要搜索的内容.当你想发送文本时,这样做:
channel.send(lyrics, { split: true });
如果 lyrics.length
大于限制,discord.js 将剪切您的消息并一个接一个地发送,使其看起来像只有一个。
channel
是您要将消息发送到的 TextChannel
。