如何将带方括号的字符串和正斜杠+变量转换为正则表达式?

时间:2016-08-18 00:21:17

标签: javascript jquery regex

我试图了解正则表达式,但我仍然无法得到它。

我想将以下String +一些变量转换为正则表达式:

"[url href=" + objectId + "]" + objectId2 + "[/url]"

我尝试了以下内容,因为我在某处读到了需要转义括号和斜杠的内容:

/\[url href=/ + objectId + /\]/ + objectId2 + /\[\/\url\]/g

但这不起作用。

我想使用它将整个表达式替换为HTML中的任何匹配项。

3 个答案:

答案 0 :(得分:0)

您是正确的,括号和反斜杠需要在正则表达式中进行转义,但您无法通过将/\[url href=/ + objectId + /\]/尝试等正则表达式文字相加来创建正则表达式。要动态构建正则表达式,必须使用字符串连接并将结果传递给new RegExp()。因此,作为文本的起点,您需要这样:

new RegExp("\\[url href=" + objectId + "\\]" + objectId2 + "\\[/url\\]")

注意所有的双反斜杠 - 这是因为反斜杠需要在字符串文字中进行转义,因此"\\["会创建一个包含单个反斜杠的字符串,然后是一个括号,这就是你想要的正则表达式。< / p>

但是如果你想提取匹配的href和内容以用于创建锚点,那么你需要捕获括号:

new RegExp("\\[url href=(" + objectId + ")\\](" + objectId2 + ")\\[/url\\]")

但是这仍然不足以满足您的目的,因为objectIdobjectId2可以(或者,如果第一个是网址)包含其他需要在正则表达式中进行转义的字符,例如, .+?()等等所以这是一个可以逃避所有必要字符的函数:

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}}个字段,其中包含objectIdobjectId2变量中指定的特定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&amp;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