英文:
How to parse LINKS with SPACES in TEXT?
问题
我需要解析文本中的链接并按换行和空格分割。但如果文件名中包含空格,则会出现问题。
http://example.com/file (1).jpg
文本区域中的链接可能是在新行中:
http://ex.com/link1.jpg
http://ex.com/link2.jpg
或者带有一个空格:
http://ex.com/link1.jpg http://ex.com/link2.jpg http://ex.com/link2.jpg
或者是新行和空格的组合。
我的代码:
var linksArr = [];
var text = $("textarea[name=fileslist]").val();
if (text != undefined) {
text = text.trim(); // 去除文本开头和结尾的空格
if (text != '') {
text = text.split("\n"); // 按照换行符分割
if (Array.isArray(text) && text.length) {
for (var a = 0; a < text.length; a++) {
var tLine = text[a].trim(); // 再次去除空格
if (tLine != '') {
tLine = tLine.replace(/\s+/g, '\n'); // 用换行符替换空格
var listLines= tLine.split("\n"); // 再次按照换行符分割
if (Array.isArray(listLines) && listLines.length) {
// 问题在这里
// 加入数组
}
}
}
}
}
}
console.log(linksArr);
我还尝试使用encodeURI(text)
,但是在同一行的链接之间替换空格时会出现问题(http://ex.com/link1.jpg http://ex.com/link2.jpg
)。
你能帮助找到一个更优化的解决方案吗?
英文:
I need to parse text with links from textarea and split It by NewLines and Spaces.
But there is a problem if the link to the file contains spaces in the file name.
http://example.com/file (1).jpg
Links in textarea may be in newlines:
http://ex.com/link1.jpg
http://ex.com/link2.jpg
or with 1 space
http://ex.com/link1.jpg http://ex.com/link2.jpg http://ex.com/link2.jpg
or combinations of newlines and spaces
My Code:
var linksArr = [];
var text = $("textarea[name=fileslist]").val();
if (text != undefined) {
text = text.trim(); // remove spaces from start and end of text
if (text != '') {
text = text.split("\n"); // split by NEW LINE
if (Array.isArray(text) && text.length) {
for (var a = 0; a < text.length; a++) {
var tLine = text[a].trim(); // trim again
if (tLine != '') {
tLine = tLine.replace(/\s+/g, '\n'); // replace spaces by New Line
var listLines= tLine.split("\n"); // and splin by New Line Again
if (Array.isArray(listLines) && listLines.length) {
// PROBLEM IS HERE
// push to array
}
}
}
}
}
}
console.log(linksArr);
Also I try to encodeURI(text)
but then there is a problem with replacing spaces between links on the same line (http://ex.com/link1.jpg http://ex.com/link2.jpg
)
Can you help with optimal solution?
答案1
得分: 1
你可以通过空格分隔,然后将得到的数组连接到收集链接的数组中:
function parse() {
var linksArr = [];
for (let element of document.querySelectorAll("textarea[name=fileslist]")) {
let newArray = element.value.split(/\s/).filter(item => item);
let newItem = "";
for (let item of newArray) {
if (newItem === "") {
newItem = item;
} else if (item.indexOf("://") < 0) {
newItem += item;
} else {
linksArr.push(newItem);
newItem = item;
}
}
if (newItem) linksArr.push(newItem);
}
console.log(linksArr);
}
解释:
- 我提供了三个具有指定名称的文本区域,以便有两个不同的示例。
- 我对它们进行循环。
- 对于每个文本区域
- 我将其按空格分隔。
- 过滤结果以删除空项。
- 循环过滤后的数组
- 如果我们还没有当前链接,那么我们将项目设置为我们的当前链接。
- 否则,如果我们的子字符串中没有
://
,那么我们将当前链接附加上去。 - 否则,我们将刚刚结束的链接推送到
linkArr
,并将当前块设置为我们的当前链接。
- 当循环完成时,如果我们尚未这样做,我们将推送任何剩余的链接。
英文:
You can split by whitespaces and concat
the resulting array into the array where you collect your links into:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
function parse() {
var linksArr = [];
for (let element of document.querySelectorAll("textarea[name=fileslist]")) {
let newArray = element.value.split(/\s/).filter(item => item);
let newItem = "";
for (let item of newArray) {
if (newItem === "") {
newItem = item;
} else if (item.indexOf("://") < 0) {
newItem += item;
} else {
linksArr.push(newItem);
newItem = item;
}
}
if (newItem) linksArr.push(newItem);
}
console.log(linksArr);
}
<!-- language: lang-html -->
<textarea name="fileslist">http://a.b.c http://d.e.f</textarea>
<textarea name="fileslist">http://g.h.i
http://j.k.l</textarea>
<textarea name="fileslist">http://m.n.o (1) http://p.q.r (2)</textarea>
<input type="button" value="Parse" onclick="parse()">
<!-- end snippet -->
Explanation:
- I have provided three textareas with the specified name to have two distinct examples
- I'm looping them
- for each textarea
- I split it by whitespaces
- filter the result to remove empty items
- looping the filtered array
- if we do not have a current link yet, then we set the item to our current link
- else if we do not have
://
in our substring, then we append our current link - else we push the just ended link to
linkArr
and set our current chunk as our current link
- when the loop completes, we push any remaining link if we did not do so already
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论