JavaScript RegExp#hasgtag替换为html中没有超哈希链接的链接
我想用JavaScript或jQuery将JavaScript RegExp#hasgtag替换为html中没有超哈希链接的链接,javascript,jquery,html,regex,replace,Javascript,Jquery,Html,Regex,Replace,我想用JavaScript或jQuery将#hashtag文本替换为 在这里,我尝试: <!DOCTYPE html> <html> <body> <button onclick="myFunction()">Try it</button> <p id="demo">Please visit #Microsoft! #facebook <a href="#link"> Somelink</a>
#hashtag
文本替换为
在这里,我尝试:
<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Try it</button>
<p id="demo">Please visit #Microsoft! #facebook <a href="#link"> Somelink</a>
</p>
<script>
function myFunction() {
var str = document.getElementById("demo").innerHTML;
var txt = str.replace(/#\w+\.?\w+/g,"<a href=\"http://example.com?hashtag=selectedteg\">#Selected</a> ");
document.getElementById("demo").innerHTML = txt;
}
</script>
</body>
</html>
试试看
请访问微软#脸谱网
函数myFunction(){
var str=document.getElementById(“demo”).innerHTML;
var txt=str.replace(/#\w+\.?\w+/g,”);
document.getElementById(“demo”).innerHTML=txt;
}
但是这个结果返回
<p id="demo">Please visit <a href="http://example.com?hashtag=selectedteg">#Selected</a> ! <a href="http://example.com?hashtag=selectedteg">#Selected</a> <a href="<a href=" http:="" example.com?hashtag="selectedteg"">#Selected</a> "> Somelink
</p>
请访问!“Somelink
我想成为这样的人
<p id="demo">Please visit <a href="http://example.com?hashtag=Microsoft">#Microsoft</a> ! <a href="http://example.com?hashtag=facebook">#facebook</a> <a href="#link">Somelink</a>
</p>
请访问!
您需要捕获组,然后在替换中使用它。例如:
var txt = str.replace(/#(\w+\.?\w+)/g,"<a href=\"http://example.com?hashtag=$1\">#$1</a> ");
它利用了一个事实,即现有链接中的#链接
不是由空格进行的。因此,您可以得到如下结果:
函数myFunction(){
var str=document.getElementById(“demo”).innerHTML;
var txt=str.replace(/\s(?!href=“)#(\s+)/g,”);
document.getElementById(“demo”).innerHTML=txt;
}
试试看
请访问微软#脸谱网
您需要捕获组,然后在替换中使用它。比如:
var txt = str.replace(/#(\w+\.?\w+)/g,"<a href=\"http://example.com?hashtag=$1\">#$1</a> ");
它利用了现有链接中的#链接
不是由空格进行的这一事实。你会得到这样的结果:
函数myFunction(){
var str=document.getElementById(“demo”).innerHTML;
var txt=str.replace(/\s(?!href=“)#(\s+)/g,”);
document.getElementById(“demo”).innerHTML=txt;
}
试试看
请访问#Microsoft!#facebook
您必须捕获带括号的文本,但也必须仅捕获文本,而不是html标记中的内容。请参阅函数中的注释
函数hashtagReplace(){
var text=document.getElementById(“demo”).innerHTML;
//您必须首先捕获文本,以避免捕获示例中的#链接
//文本介于输入的开始或“>”和输入的结束之间,“您必须用括号捕获文本,但也必须仅捕获文本,而不是html标记中的内容。请参阅函数中的注释
函数hashtagReplace(){
var text=document.getElementById(“demo”).innerHTML;
//您必须首先捕获文本,以避免捕获示例中的#链接
//文本介于输入的开始或“>”和输入的结束之间,并且“哇!这是一个令人惊讶的难题,尽管乍一看应该很简单
问题是,严格地说,您的需求要求只处理文本节点来将hashtag转换为链接。不应该触及现有的HTML
天真的方法(见其他答案)将试图设计一个复杂的正则表达式来避开HTML。虽然这可能在某些情况下有效,甚至几乎在所有实际情况下都有效,但这绝对不是万无一失的。正则表达式的功能根本不足以完全解析HTML;它只是一种太复杂的语言。请参阅优秀且相当著名的堆栈溢出answ呃,至少,不可能做到完美,也不应该做到
相反,正确的方法是使用递归JavaScript函数遍历HTML树,并将所有目标文本节点替换为其自身的处理版本,重要的是,这可能涉及在文本节点内引入(非文本)HTML标记
jQuery可以用最小的复杂性来完成这项任务,尽管任务本身需要一定的复杂性,老实说,这是无法避免的
HTML
如您所见,对text()
的单个调用将获取纯文本节点的文本内容,然后调用string对象上的replace()
函数以用HTML替换任何hashtag,然后调用jQuery的replaceWith()
方法允许我们用生成的HTML替换整个文本节点,或者在未执行替换的情况下保留原始纯文本
工具书类
哇!这是一个令人惊讶的难题,尽管乍一看似乎应该很简单
问题是,严格地说,您的需求要求只处理文本节点来将hashtag转换为链接。不应该触及现有的HTML
天真的方法(见其他答案)将试图设计一个复杂的正则表达式来避开HTML。虽然这可能在某些情况下有效,甚至几乎在所有实际情况下都有效,但这绝对不是万无一失的。正则表达式的功能根本不足以完全解析HTML;它只是一种太复杂的语言。请参阅优秀且相当著名的堆栈溢出answ呃,至少,不可能做到完美,也不应该做到
相反,正确的方法是使用递归JavaScript函数遍历HTML树,并将所有目标文本节点替换为其自身的处理版本,重要的是,这可能涉及在文本节点内引入(非文本)HTML标记
jQuery可以用最小的复杂性来完成这项任务,尽管任务本身需要一定的复杂性,老实说,这是无法避免的
HTML
如您所见,对
text()
的单个调用将获取纯文本节点的文本内容,然后调用string对象上的replace()
函数以用HTML替换任何hashtag,然后调用jQuery的replaceWith()
方法允许我们用生成的HTML替换整个文本节点,或者在未执行替换的情况下保留原始纯文本
工具书类
<button onclick="tryItClick()">Try it</button>
<p id="demo">Please visit #Microsoft! #facebook <a href="#link">Somelink</a>
</p>
if (!window.Node) {
window.Node = {
ELEMENT_NODE : 1,
ATTRIBUTE_NODE : 2,
TEXT_NODE : 3,
CDATA_SECTION_NODE : 4,
ENTITY_REFERENCE_NODE : 5,
ENTITY_NODE : 6,
PROCESSING_INSTRUCTION_NODE : 7,
COMMENT_NODE : 8,
DOCUMENT_NODE : 9,
DOCUMENT_TYPE_NODE : 10,
DOCUMENT_FRAGMENT_NODE : 11,
NOTATION_NODE : 12
};
} // end if
window.linkify = function($textNode) {
$textNode.replaceWith($textNode.text().replace(/#(\w+\.?\w+)/g,'<a href="http://example.com?hashtag=$1">#$1</a>'));
}; // end linkify()
window.processByNodeType = function($cur, nodeTypes, callback, payload ) {
if (!nodeTypes.length)
nodeTypes = [nodeTypes];
for (var i = 0; i < $cur.length; ++i) {
if ($.inArray($cur.get(i).nodeType, nodeTypes ) >= 0)
callback($cur.eq(i), $cur, i, payload );
processByNodeType($cur.eq(i).contents(), nodeTypes, callback, payload );
} // end for
} // end processByNodeType()
window.tryItClick = function(ev) {
var $top = $('#demo');
processByNodeType($top, Node.TEXT_NODE, linkify );
}; // end tryItClick()
$textNode.replaceWith($textNode.text().replace(/#(\w+\.?\w+)/g,'<a href="http://example.com?hashtag=$1">#$1</a>'));