【发布时间】:2011-10-06 03:42:15
【问题描述】:
如何查找文本是否包含 url 字符串。我的意思是如果我有
Sometexthttp://daasddas some text
我希望 http://daasddas 被锚定或作为 javascript 链接
【问题讨论】:
标签: javascript
如何查找文本是否包含 url 字符串。我的意思是如果我有
Sometexthttp://daasddas some text
我希望 http://daasddas 被锚定或作为 javascript 链接
【问题讨论】:
标签: javascript
function replaceURLWithHTMLLinks(text)
{
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
return text.replace(exp,"<a href='$1'>$1</a>");
}
【讨论】:
虽然如果所有给定的 URL 都是完整的 (http://mydomain.com),上面的代码运行良好,但我在解析如下 URL 时遇到了问题:
www.mydomain.com
即没有协议。 所以我在函数中添加了一些简单的代码:
var exp = /(\b(((https?|ftp|file|):\/\/)|www[.])[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
var temp = text.replace(exp,"<a href=\"$1\" target=\"_blank\">$1</a>");
var result = "";
while (temp.length > 0) {
var pos = temp.indexOf("href=\"");
if (pos == -1) {
result += temp;
break;
}
result += temp.substring(0, pos + 6);
temp = temp.substring(pos + 6, temp.length);
if ((temp.indexOf("://") > 8) || (temp.indexOf("://") == -1)) {
result += "http://";
}
}
return result;
如果有人应该找到更优化的解决方案来为 URL 添加默认协议,请告诉我!
【讨论】:
您必须使用正则表达式(正则表达式)在文本块中查找 URL 模式。
这是指向相同问题和答案的链接: Regular Expression to find URLs in block of Text (Javascript)
【讨论】:
我调整了dperinis regex-url script,以便可以找到嵌入在字符串中的 URL。它不会找到 google.com,如果它是用户输入字段,则这是必要的,用户可能会在句号/句号后遗漏空格。它还会找到 www.google.com,因为几乎没有人键入协议。
(?:((?:https?|ftp):\/\/)|ww)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?
我在www.regextester.com上测试过,对我有用,如果遇到问题,请评论。
【讨论】:
您可以使用正则表达式查找 URL 并将其替换为带有前导和尾随标记的 URL
【讨论】:
许多解决方案开始变得非常复杂,难以应对各种情况。这是我创建的一个函数,用于捕获以 http/https/ftp/file/www 开头的任何 URL。这对我来说就像一个魅力,它唯一没有添加链接的是用户输入的 URL 开头没有 http 或 www(即 google.com)。我希望这个解决方案对某人有所帮助。
function convertText(txtData) {
var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
txtData = txtData.replace(urlRegex, '<a href="$1">$1</a>');
var urlRegex =/(\b(\swww).[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
txtData = txtData.replace(urlRegex, ' <a href="$1">$1</a>');
var urlRegex =/(>\swww)/ig;
txtData = txtData.replace(urlRegex, '>www');
var urlRegex =/(\"\swww)/ig;
txtData = txtData.replace(urlRegex, '"http://www');
return txtData;
}
【讨论】:
function replaceURLWithHTMLLinksHere(text)
{
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
return text.replace(exp,"<a href='$1'>$1</a>");
}
好的,我们在函数中得到了这个正则表达式。
/(\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~|!:,.;]*[-A-Z0 -9+&@#/%=~|])/ig
让我们明白这一点。
//这是正则表达式的开始方式。
\b > 正在处理 https 或 ftp 或唯一且位于字符串开头的文件。这些关键字不应在其中附加任何字符 以 bbhttps 或 bbhttp 开头,否则将不匹配。
https? > 这里?表示零个或前面的字符或组之一。在这种情况下,s 是可选的。
| > 匹配一个给定的,就像 OR。
()> 创建要匹配的组
/> 表示下一个字符是特殊的,不能按字面解释。例如,前面没有 '\' 的 'b' 通常匹配小写 'b 在它们出现的任何地方。但是 '\b' 本身不匹配任何字符
[] > 这是字符类或字符集。它用于有一组字符,一次只有一个字符出现。
[-A-Z0-9+&@#/%?=~_|!:,.;]* > 前面的元素出现零次或多次。例如,b*c 匹配“c”、“bc”、“bbc”、“bbbc”等。
[-A-Z0-9+&@#/%=~_|] > 表示其中一个字符。
i > 不区分大小写的搜索。 g > 全局搜索。
【讨论】:
function replaceURLWithLinks(text){
var text = "";
text= text.replace(/\r?\n/g, '<br />');
var result = URI.withinString(text, function(url) {
return "<a href='"+url+"' target='_blank'>" + url + "</a>";
});
}
【讨论】: