JavaScript正则表达式,查找引文外的所有文本

时间:2012-02-06 19:50:22

标签: javascript html regex

为了澄清,我对正则表达式非常可怕。我已经在这里找到了一些这方面的例子,但我根本不知道如何为我的用法实现它。

我在JavaScript中为客户端做了一个(相当糟糕的)从英语到法语的翻译,但是我遇到了一个问题,即它正在翻译变量名和select-option值,这显然会破坏搜索功能和入口函数

我现有的代码:

var englishStrings = new Array();
englishStrings[0] = /List Members/g;

var frenchStrings = new Array();
frenchStrings[0] = "Listes des membres";

$(document).ready(function() {
    //alert(language);
    if (language == "English" || language == null)
    {
        $("#language_link").text("Voir en français");
        var strNewString = $('body').html();
        strNewString = strNewString.replace(/Nccp/g, 'NCCP');
        strNewString = strNewString.replace(/Actions/g, 'Menu');
        strNewString = strNewString.replace(/Id/g, 'ID');
    }
    else
    {
        $("#language_link").text("View in English");
        var strNewString = $('body').html();
        strNewString = strNewString.replace(/Nccp/g, 'NCCP');
        strNewString = strNewString.replace(/Actions/g, 'Menu');
        strNewString = strNewString.replace(/Id/g, 'ID');
        $.each(englishStrings, function(index, value) {
            strNewString = strNewString.replace(value, frenchStrings[index]);
        });
        strNewString = strNewString.replace('Voir', 'View');
    }
    $('body').html(strNewString);
});

我想更改正则表达式查找字符串(/ List Members / g)以在搜索范围内排除引号,而不是像我见过的例子那样。 例如:

<option value="List Members">List Members</option>

目前正在

<option value="Listes des membres">Listes des membres</option>

我希望它成为

<option value="List Members">Listes des membres</option>

排除用引号括起来的字符串。

同样,我知道正则表达式对于操作HTML是一个糟糕的选择,我很遗憾这样做,但我们已经投入了相当多的时间这样做。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你可以尝试使用这样的东西:

replace(/([^"'])List Members([^"'])/g, '$1Listes des membres$2')

(或更精确的变体:replace(/([^"'])List Members\1/g, '$1Listes des membres$1') - 只会排除具有匹配开头和结尾引号的字符串)

在许多方言中,可以不添加对替换字符串的反向引用,如下所示:

replace(/(?<!'|")List Members(?!'|")/, 'Listes des membres') # won't work in JS!

这里我们在开头有负面的lookbehind检查,在结尾有负向前瞻。遗憾的是,JavaScript正则表达式引擎不支持lookbehind语法,因此只能实现表达式的前瞻部分:

replace(/List Members(?!'|")/, 'Listes des membres')`

这个字符串会用撇号或引号排除所有字符串结尾(它根本不会检查开头的引号)。

是的,正则表达式确实是操纵HTML的糟糕选择:)