用超链接包裹字符串 - jQuery&正则表达式

时间:2014-06-13 04:30:42

标签: jquery regex replace

我有以下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/

2 个答案:

答案 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');
    });
});

Demo

使用String.prototype.link()替换找到的匹配项;然后将此逻辑包装到单个.html(function)中以更新文档。