Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要简单的javascript正则表达式帮助。。。(跳过字符)_Javascript_Regex - Fatal编程技术网

需要简单的javascript正则表达式帮助。。。(跳过字符)

需要简单的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=/

我有一些正则表达式代码,可以转换任何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=/(\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:正如我在修正案中指出的那样