在字符串开头匹配字符,忽略html标记中的字符串

时间:2012-12-17 15:27:05

标签: javascript regex

请一点帮助......

我有一个正则表达式,匹配字符串开头的字符,如下所示:

如果我有一组这样的字符串:

Ray Fox 
Foster Joe
Finding Forrester

REGEX

/\bfo[^\b]*?\b/gi 

这将符合Fox,Foster和Forrester的'FO'预期:

但是,我遇到一个问题,如果字符串集包含在html标签中,就像这样; -

<span class="fontColor1">Ray Fox</span>
<span class="fontColor2">Foster Joe</span>
<span class="fontColor3">Finding Forrester</span>

这也会匹配fontColor *中的'FO'。

我对正则表达式相当绿色,我需要一些帮助来更新查询,以便它只搜索存在HTML标记的HTML标记之间的值,但如果HTML标记不存在仍然可以正常工作。

2 个答案:

答案 0 :(得分:0)

怎么样?
<.*?span.*?>(.*?)<\s?\/.*?span.*?>

你在哪里有html标签不存在的文字?这毫无意义。

编辑:

此解决方案与嵌套标记不匹配,但在编写问题时,这似乎不是问题。

答案 1 :(得分:0)

您可以使用html解析器并提取纯文本,并将其匹配。

var root;

try {
    root = document.implementation.createHTMLDocument("").body;
}
catch(e) {
    root = document.createElement("body");
}

root.innerHTML = '<span class="fontColor1">Ray Fox</span>\
            <span class="fontColor2">Foster Joe</span>\
            <span class="fontColor3">Finding Forrester</span>';

//If you are using jQuery
var text = $(root).text();

//Proceed as normal with the text variable

如果您不使用jQuery,可以将$(root).text()替换为findText(root),其中findText

function findText(root) {
    var ret = "",
        nodes = root.childNodes;
    for (var i = 0; i < nodes.length; ++i) {
        if (nodes[i].nodeType === 3) {
            ret += nodes[i].nodeValue;
        } else if (nodes[i].nodeType === 1) {
            ret += findText(nodes[i]);
        }
    }
    return ret;
}