需要简单的javascript正则表达式帮助。。。(跳过字符)
我有一些正则表达式代码,可以转换任何url,即需要简单的javascript正则表达式帮助。。。(跳过字符),javascript,regex,Javascript,Regex,我有一些正则表达式代码,可以转换任何url,即http://www.url.com将字符串转换为超链接,即 正则表达式代码: var exp = /(\b(https?|):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; toReturn = toReturn.replace(exp,"<a target='_blank' href='$1'>$1</a>"); var exp=/
http://www.url.com
将字符串转换为超链接,即
正则表达式代码:
var exp = /(\b(https?|):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
toReturn = toReturn.replace(exp,"<a target='_blank' href='$1'>$1</a>");
var exp=/(\b(https?):\/\/[-A-Z0-9+&@#\/%?=~~|!:,.;]*[-A-Z0-9+&@#\/%=~|]/ig;
toReturn=toReturn.replace(exp,“”);
但是我不希望它在某些字符之间进行搜索/替换,特别是[img][img]
**注意:[img][/img]和URL可能多次出现在字符串中
我该怎么做
非常感谢,当需要上下文相关编辑时,全局替换是错误的方法。您可以使用扫描程序查找连续的标记,然后在循环中输出一些未更改的标记和一些已编辑的标记。我找不到如何使用标准javascript或其regexp方法实现这一点。如果您找到一个javascript标记器,其中您使用regexp或类似工具定义了标记,那么您就快找到了。当需要上下文相关编辑时,全局替换是错误的方法。您可以使用扫描程序查找连续的标记,然后在循环中输出一些未更改的标记和一些已编辑的标记。我找不到如何使用标准javascript或其regexp方法实现这一点。如果您找到一个javascript标记器,其中您使用regexp或类似的方法定义标记,您就快找到了。仅使用regexp是非常棘手的。这是因为正则表达式只能匹配*,任何具有打开/关闭标记的语言都不太可能是正则的 (*在实践中,大多数编程语言中的“正则表达式”实际上不是正则的,并且具有匹配更复杂语言的功能……但我很少发现这些功能有用,我认为它们不值得用于解决这个问题) 一个更好的方法是编写一个简单的解析器,根据标记拆分输入,然后只针对可能包含URL的部分运行正则表达式 例如,类似于:
function fix_urls(str) {
var result = [];
var url_re = /\bhttp:…/g;
var tag_re = /(\[\/?[a-zA-Z]+\])/g;
var split = str.split(tag_re);
var in_tag = 0;
for (var i = 0; i < split.length; i += 1) {
var part = split[i];
if (part.search(tag_re) == 0) {
if (part[1] == "/")
in_tag -= 1;
else
in_tag += 1;
} else if (in_tag == 0) {
part = part.replace(url_re, "<a …>…</a>");
}
result.push(part);
}
return result.join("");
}
函数修复URL(str){
var结果=[];
var url_re=/\bhttp:…/g;
var tag_re=/(\[\/?[a-zA-Z]+\])/g;
var split=str.split(标记);
_标签中的var=0;
对于(变量i=0;i
仅使用一个regexp是非常棘手的。这是因为正则表达式只能匹配*,任何具有打开/关闭标记的语言都不太可能是正则的
(*在实践中,大多数编程语言中的“正则表达式”实际上不是正则的,并且具有匹配更复杂语言的功能……但我很少发现这些功能有用,我认为它们不值得用于解决这个问题)
一个更好的方法是编写一个简单的解析器,根据标记拆分输入,然后只针对可能包含URL的部分运行正则表达式
例如,类似于:
function fix_urls(str) {
var result = [];
var url_re = /\bhttp:…/g;
var tag_re = /(\[\/?[a-zA-Z]+\])/g;
var split = str.split(tag_re);
var in_tag = 0;
for (var i = 0; i < split.length; i += 1) {
var part = split[i];
if (part.search(tag_re) == 0) {
if (part[1] == "/")
in_tag -= 1;
else
in_tag += 1;
} else if (in_tag == 0) {
part = part.replace(url_re, "<a …>…</a>");
}
result.push(part);
}
return result.join("");
}
函数修复URL(str){
var结果=[];
var url_re=/\bhttp:…/g;
var tag_re=/(\[\/?[a-zA-Z]+\])/g;
var split=str.split(标记);
_标签中的var=0;
对于(变量i=0;i
错误!!!除了RE2之外,再也没有人使用旧式意义上的正则表达式了。一旦您有了类似于([a-z]+).\1
的东西,您就有了一种非规则语言,由于辅助存储需求,DFA无法解决这一问题。在过去20-30年中到处使用的真实世界模式与非正则语言非常匹配。请不要再打这匹死马了。这不是真的。它甚至都不接近真实。对。。。那么,这个问题有解决办法吗?还是仍然不可能?@tchrist:请原谅我不够精确。您完全正确,是的,当前正则表达式的实现完全不是正则的。然而,除了文档和示例之外,我还没有看到在任何地方使用这种功能(更不用说以一种理智的方式)。不过,我很高兴被证明是错的,所以如果你想写一个不太规则的表达式来回答这个问题,我会第一个投赞成票。@James:正如我在修正后的答案中所指出的,这是可能的,但我不建议这样做。如果我必须解决这个问题,我会使用一个类似于我答案中的函数。错!!!除了RE2之外,再也没有人使用旧式意义上的正则表达式了。一旦您有了类似于([a-z]+).\1
的东西,您就有了一种非规则语言,由于辅助存储需求,DFA无法解决这一问题。在过去20-30年中到处使用的真实世界模式与非正则语言非常匹配。请不要再打这匹死马了。这不是真的。它甚至都不接近真实。对。。。那么,这个问题有解决办法吗?还是仍然不可能?@tchrist:请原谅我不够精确。您完全正确,是的,当前正则表达式的实现完全不是正则的。然而,除了文档和示例之外,我还没有看到在任何地方使用这种功能(更不用说以一种理智的方式)。不过,我很高兴被证明是错的,所以如果你想写一个不太规则的表达式来回答这个问题,我会第一个投赞成票。@James:正如我在修正案中指出的那样