查找并替换特定字符串
Find and replace specific strings
我有一个像这样的字符串(推文):
var str = "blah blah blah blah http://example.com blah blah #something blah blah https://example.com blah blah @person"
我想挑出所有应该是 link 的东西并用 link 标签包裹起来。需要在字符串中找到以下4个东西:
- 任何以
@
开头的单词
- 任何以
#
开头的单词
- 任何以
http://
开头的单词
- 任何以
https://
开头的单词
所以我想它会有点像这样:
str.replace(regexForHashtag, '<a href="' + linkText + '">" + linkText + "</a>");
我会使用以下正则表达式:
/(?:^|\s)((?:@|#|https?:\/\/)\S+)/
您需要的单词在组 1 中。
基于Parsing Twitter Usernames, Hashtags and URLs with JavaScript:
String.prototype.parseURL = function() {
return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&~\?\/.=]+/g, function(url) {
return url.link(url);
});
};
String.prototype.parseUsername = function() {
return this.replace(/[@]+[A-Za-z0-9-_]+/g, function(u) {
var username = u.replace("@","");
return u.link("http://twitter.com/"+username);
});
};
String.prototype.parseHashtag = function() {
return this.replace(/[#]+[A-Za-z0-9-_]+/g, function(t) {
var tag = t.replace("#","%23");
return t.link("http://search.twitter.com/search?q="+tag);
});
};
String.prototype.parseTweet = function() {
return this.parseURL().parseUsername().parseHashtag();
};
可以这样称呼:
var str = "blah blah blah blah http://example.com blah blah #something blah blah https://example.com blah blah @person"
str.parseTweet();
// or:
// str.parseURL
// str.parseUsername
// str.parseHashtag
您可以简单地使用捕获组:
a = "blah blah blah blah http://example.com blah blah #something blah blah https://example.com blah blah @person";
a = a.replace(/(^|\s)(((https?:\/\/)|[@#])\S*)/g,'<a href=""></a>');
alert(a);
这导致:
blah blah blah blah<a href="http://example.com">http://example.com</a> blah blah<a href="#something">#something</a> blah blah<a href="https://example.com">https://example.com</a> blah blah<a href="@person">@person</a>
编辑:由于不应在 href 中复制用户名和哈希值,因此您可以使用三阶段查找和替换来做到这一点:
a = "blah blah blah blah http://example.com blah blah #something blah blah https://example.com blah blah @person";
a = a.replace(/(^|\s)(https?:\/\/\S*)/g,'<a href=""></a>');
a = a.replace(/(^|\s)[@](\S*)/g,'<a href="http://twitter.com/"></a>');
a = a.replace(/(^|\s)[#](\S*)/g,'<a href="https://twitter.com/search?q=%23"></a>');
alert(a);
这导致:
blah blah blah blah<a href="http://example.com">http://example.com</a> blah blah<a href="https://twitter.com/search?q=%23something">something</a> blah blah<a href="https://example.com">https://example.com</a> blah blah<a href="http://twitter.com/person">person</a>
@tom 你的解决方案一次只会解析一个字符串。但是 twitter 会在你输入的同时解析所有内容。
@Coop想要
- 以@开头的任何单词
- 任何以#
开头的单词
- 任何以 http://
开头的单词
- 任何以 https://
开头的单词
这是我玩完这个玩具后的做法here
可以找到更多解释here
<div id="element">new text will drop here</div>
<script type="text/javascript">
$(document).ready(function(){
function convertTextToUrl(refinedText) {
var refinedText, refinePattern1, refinePattern2, refinePattern3, refinePattern4;
//URLs starting with http://, https://, or ftp://
refinePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
refinedText = refinedText.replace(refinePattern1, function(UrlTo) {
return UrlTo.link(UrlTo);
});
//URLs starting with www
refinePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
refinedText = refinedText.replace(refinePattern2, function(UrlTo) {
return UrlTo.link(UrlTo);
});
//mention with @
refinePattern3 = /[@]+[A-Za-z0-9-_]+/gim;
refinedText = refinedText.replace(refinePattern3, function(u) {
var username = u.replace("@","")
return u.link("http://twitter.com/"+username);
});
//# hastag
refinePattern4 = /[#]+[A-Za-z0-9-_]+/gim;
refinedText = refinedText.replace(refinePattern4, function(t) {
return t.link("https://twitter.com/"+t);
});
return refinedText;
} //USAGE
var TextToUrl= "Tubentertain is a web base #application, kind of a #device such as a #television or #multimedia player that has access to contents residing at remote sites.contact @tubentertain or visit http://tubentertain.com";
var newText=convertTextToUrl(TextToUrl);
$("#element").html(newText);
//========================
});
此功能可用于许多其他事情,例如将页面上的所有相似文本转换为 link 到其他内容的网址。
我有一个像这样的字符串(推文):
var str = "blah blah blah blah http://example.com blah blah #something blah blah https://example.com blah blah @person"
我想挑出所有应该是 link 的东西并用 link 标签包裹起来。需要在字符串中找到以下4个东西:
- 任何以
@
开头的单词
- 任何以
#
开头的单词
- 任何以
http://
开头的单词
- 任何以
https://
开头的单词
所以我想它会有点像这样:
str.replace(regexForHashtag, '<a href="' + linkText + '">" + linkText + "</a>");
我会使用以下正则表达式:
/(?:^|\s)((?:@|#|https?:\/\/)\S+)/
您需要的单词在组 1 中。
基于Parsing Twitter Usernames, Hashtags and URLs with JavaScript:
String.prototype.parseURL = function() {
return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&~\?\/.=]+/g, function(url) {
return url.link(url);
});
};
String.prototype.parseUsername = function() {
return this.replace(/[@]+[A-Za-z0-9-_]+/g, function(u) {
var username = u.replace("@","");
return u.link("http://twitter.com/"+username);
});
};
String.prototype.parseHashtag = function() {
return this.replace(/[#]+[A-Za-z0-9-_]+/g, function(t) {
var tag = t.replace("#","%23");
return t.link("http://search.twitter.com/search?q="+tag);
});
};
String.prototype.parseTweet = function() {
return this.parseURL().parseUsername().parseHashtag();
};
可以这样称呼:
var str = "blah blah blah blah http://example.com blah blah #something blah blah https://example.com blah blah @person"
str.parseTweet();
// or:
// str.parseURL
// str.parseUsername
// str.parseHashtag
您可以简单地使用捕获组:
a = "blah blah blah blah http://example.com blah blah #something blah blah https://example.com blah blah @person";
a = a.replace(/(^|\s)(((https?:\/\/)|[@#])\S*)/g,'<a href=""></a>');
alert(a);
这导致:
blah blah blah blah<a href="http://example.com">http://example.com</a> blah blah<a href="#something">#something</a> blah blah<a href="https://example.com">https://example.com</a> blah blah<a href="@person">@person</a>
编辑:由于不应在 href 中复制用户名和哈希值,因此您可以使用三阶段查找和替换来做到这一点:
a = "blah blah blah blah http://example.com blah blah #something blah blah https://example.com blah blah @person";
a = a.replace(/(^|\s)(https?:\/\/\S*)/g,'<a href=""></a>');
a = a.replace(/(^|\s)[@](\S*)/g,'<a href="http://twitter.com/"></a>');
a = a.replace(/(^|\s)[#](\S*)/g,'<a href="https://twitter.com/search?q=%23"></a>');
alert(a);
这导致:
blah blah blah blah<a href="http://example.com">http://example.com</a> blah blah<a href="https://twitter.com/search?q=%23something">something</a> blah blah<a href="https://example.com">https://example.com</a> blah blah<a href="http://twitter.com/person">person</a>
@tom 你的解决方案一次只会解析一个字符串。但是 twitter 会在你输入的同时解析所有内容。
@Coop想要
- 以@开头的任何单词
- 任何以# 开头的单词
- 任何以 http:// 开头的单词
- 任何以 https:// 开头的单词
这是我玩完这个玩具后的做法here 可以找到更多解释here
<div id="element">new text will drop here</div>
<script type="text/javascript">
$(document).ready(function(){
function convertTextToUrl(refinedText) {
var refinedText, refinePattern1, refinePattern2, refinePattern3, refinePattern4;
//URLs starting with http://, https://, or ftp://
refinePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
refinedText = refinedText.replace(refinePattern1, function(UrlTo) {
return UrlTo.link(UrlTo);
});
//URLs starting with www
refinePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
refinedText = refinedText.replace(refinePattern2, function(UrlTo) {
return UrlTo.link(UrlTo);
});
//mention with @
refinePattern3 = /[@]+[A-Za-z0-9-_]+/gim;
refinedText = refinedText.replace(refinePattern3, function(u) {
var username = u.replace("@","")
return u.link("http://twitter.com/"+username);
});
//# hastag
refinePattern4 = /[#]+[A-Za-z0-9-_]+/gim;
refinedText = refinedText.replace(refinePattern4, function(t) {
return t.link("https://twitter.com/"+t);
});
return refinedText;
} //USAGE
var TextToUrl= "Tubentertain is a web base #application, kind of a #device such as a #television or #multimedia player that has access to contents residing at remote sites.contact @tubentertain or visit http://tubentertain.com";
var newText=convertTextToUrl(TextToUrl);
$("#element").html(newText);
//========================
});
此功能可用于许多其他事情,例如将页面上的所有相似文本转换为 link 到其他内容的网址。