我试图了解正则表达式,但我仍然无法得到它。
我想将以下String +一些变量转换为正则表达式:
"[url href=" + objectId + "]" + objectId2 + "[/url]"
我尝试了以下内容,因为我在某处读到了需要转义括号和斜杠的内容:
/\[url href=/ + objectId + /\]/ + objectId2 + /\[\/\url\]/g
但这不起作用。
我想使用它将整个表达式替换为HTML中的任何匹配项。
答案 0 :(得分:0)
您是正确的,括号和反斜杠需要在正则表达式中进行转义,但您无法通过将/\[url href=/ + objectId + /\]/
尝试等正则表达式文字相加来创建正则表达式。要动态构建正则表达式,必须使用字符串连接并将结果传递给new RegExp()
。因此,作为文本的起点,您需要这样:
new RegExp("\\[url href=" + objectId + "\\]" + objectId2 + "\\[/url\\]")
注意所有的双反斜杠 - 这是因为反斜杠需要在字符串文字中进行转义,因此"\\["
会创建一个包含单个反斜杠的字符串,然后是一个括号,这就是你想要的正则表达式。< / p>
但是如果你想提取匹配的href和内容以用于创建锚点,那么你需要捕获括号:
new RegExp("\\[url href=(" + objectId + ")\\](" + objectId2 + ")\\[/url\\]")
但是这仍然不足以满足您的目的,因为objectId
和objectId2
可以(或者,如果第一个是网址)包含其他需要在正则表达式中进行转义的字符,例如, .+?()
等等所以这是一个可以逃避所有必要字符的函数:
function escapeStringForRegex(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
我们不能只在整个事情中调用该函数,因为你需要未转义的括号用于捕获子匹配,所以只需在两个变量上调用它:
var urlRegex = new RegExp("\\[url href=("
+ escapeStringForRegex(objectId)
+ ")\\]("
+ escapeStringForRegex(objectId2)
+ ")\\[/url\\]");
有点乱,但似乎可以完成这项工作,你可以在这里看到:
function escapeStringForRegex(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
function createAnchors(str, objectId, objectId2) {
var urlRegex = new RegExp("\\[url href=(" + escapeStringForRegex(objectId) + ")\\](" + escapeStringForRegex(objectId2) + ")\\[/url\\]", "g");
return str.replace(urlRegex, "<a href='$1'>$2</a>");
}
document.querySelector("button").addEventListener("click", function() {
var str = document.getElementById("input").value;
var objectId = document.getElementById("objectId").value;
var objectId2 = document.getElementById("objectId2").value;
document.getElementById("output").value =
createAnchors(str, objectId, objectId2);
});
textarea { width : 100%; height: 80px; }
Input:<br><textarea id="input">This is just some text that you can edit to try things out. [url href=http://test.com.au?param=1]Test URL[/url]. Thanks.</textarea>
ObjectId:<input id="objectId" value="http://test.com.au?param=1"><br>
ObjectId2:<input id="objectId2" value="Test URL"><br>
<button>Test</button>
<textarea id="output"></textarea>
请注意,上述内容仅搜索字符串中[url]
的{{1}}个字段,其中包含objectId
和objectId2
变量中指定的特定href和内容。如果您只想将所有[url]
更改为锚点,无论它们包含哪些href和文本,请使用:
.replace(/\[url href=([^\]]+)\]([^\]]+)\[\/url\]/g, "<a href='$1'>$2</a>")
演示:
function escapeStringForRegex(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
function createAnchors(str) {
return str.replace(/\[url href=([^\]]+)\]([^\]]+)\[\/url\]/g, "<a href='$1'>$2</a>");
}
document.querySelector("button").addEventListener("click", function() {
var str = document.getElementById("input").value;
document.getElementById("output").value = createAnchors(str);
});
textarea { width : 100%; height: 80px; }
Input:<br><textarea id="input">Testing. [url href=http://test.com.au?param=1]Test URL[/url]. Thanks. Another URL: [url href=https://something.com/test?param=1&param2=123]Test URL 2[/url]</textarea>
<button>Test</button>
<textarea id="output"></textarea>
答案 1 :(得分:-1)
就像:
var rx = new RegExp('\\[url\\shref='+objectId+'\\]'+objectId2+'\\[\\/url\\]');
答案 2 :(得分:-2)
new RegExp("[url href=" + objectId + "]" + objectId2 + "[\url]")
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp