我有以下HTML:
<div class="subjectList">
<p>PHM315 Pharmacy Practice 2
<br/>PHM101 Introduction to Pharmacy
<br/>PHM215 Pharmacy Practice 1
<br/>PHM490 Rural Pharmacy Practice</p>
</div>
我想搜索符合以下模式的任何字符串:
/([A-Z][A-Z][A-Z][0-9][0-9][0-9])/g
用匹配的文字包装匹配的文字。
基本上,
<p>PHM315 Pharmacy Practice 2
变为:
<p><a href="/PHM315">PHM315</a> Pharmacy Practice 2
我几乎有这个工作,使用这个jQuery
var replaceSubjectCode = "<a href=\"/subjects/$1.html\">$1</a>";
var str = $('.subjectList p').html();
str = str.replace(/([A-Z][A-Z][A-Z][0-9][0-9][0-9])/g, new RegExp(replaceSubjectCode));
$('.subjectList p').html(str);
然而,它输出以下内容:
<div class="subjectList">
<p>/<a href="/subjects/PMH315">PHM315</a>/ Pharmacy Practice 2<br/>
请注意额外的&#34; /&#34;在&lt;之外a&gt;标签
任何有关删除这些正斜杠的帮助都将不胜感激。我尝试使用/// g运行RegExp替换 - 但我似乎无法忽略超链接。
请参阅小提琴: http://jsfiddle.net/qWP43/1/
答案 0 :(得分:0)
您需要删除对替换中 RegExp 对象的调用,这就是您/
.. /
分隔符的原因围绕您捕获的匹配$1
。您可以将其更改为以下内容:
str = str.replace(/([A-Z]{3}[0-9]{3})/g, replaceSubjectCode);
请参阅Fiddle
答案 1 :(得分:0)
.replace()
的第二个参数应该是字符串或函数,而不是你在那里的RegExp对象;它可能被强制转换为字符串,这会导致一些问题...说实话,我甚至感到惊讶它甚至有效。
您可以使用它来执行替换:
$('.subjectList p').html(function(_, html) {
return html.replace(/[A-Z]{3}\d{3}/g, function($0) {
return $0.link('/subjects/' + $0 + '.html');
});
});
使用String.prototype.link()
替换找到的匹配项;然后将此逻辑包装到单个.html(function)
中以更新文档。