2

我正式宣布自己是愚蠢的!我对正则表达式非常擅长,但是 javascript 正则表达式让我很紧张:

我有以下 html 字符串:

htmlString = '<div class="aa">TextOne</div><ul><li>one</li></ul>';

我需要根据 aa 类 div 内的文本获取 UL 元素内的所有内容。

我尝试了以下方法:

textItem = 'TextOne';

ulRegex = new RegExp('<div class="aa">'+textItem+'</div><ul>(.*)</ul>', "igm");
ul = ulRegex.exec(htmlString);

在写这个问题时,我在我的正则表达式中发现了一个错误(一个微小的额外字符),它没有让它匹配,但对于所有寻找特定内容的人 - javascript / 正则表达式 / html 字符串 / html 子字符串 - 它工作正常。

已编辑

我很感谢对此的所有补充——但我正在使用正则表达式的另一个方面——我正在匹配一个文本项,我首先通过一个变量来获取正则表达式模式。

解决方案

收到一些提示和建议后,我想出了以下内容,这也可能对其他人有所帮助:

htmlString = '<div class="aa">TextOne</div><ul><li>one</li></ul>';

textItem = 'TextOne';

tempdiv = $('<div/>'); 
tempdiv.html(htmlString);
ul = tempdiv.find('div.aa:contains('+textItem+')').next('ul');

$('#res').append(ul);

http://jsfiddle.net/sdXpJ/

下一个 ul 很重要,因为它解决了有关嵌套 UL 和任何其他基于正则表达式的解决方案的问题,其中我无法匹配第一级 UL(具有内部一个或多个 Uls)。

4

2 回答 2

1

解决方案

收到一些提示和建议后,我想出了以下内容,这也可能对其他人有所帮助:

htmlString = '<div class="aa">TextOne</div><ul><li>one</li></ul>';

textItem = 'TextOne';

tempdiv = $('<div/>'); 
tempdiv.html(htmlString);
ul = tempdiv.find('div.aa:contains('+textItem+')').next('ul');

$('#res').append(ul);

http://jsfiddle.net/sdXpJ/

“下一个 ul”很重要,因为它解决了有关嵌套 UL 和任何其他基于正则表达式的解决方案的问题,其中我无法匹配第一级 UL(具有内部一个或多个 Uls)。

于 2013-10-29T11:00:47.143 回答
0

您可以为此使用一个简单的indexOf方法:

function str_between(str, searchStart, searchEnd, caseSensitive, offset) {
    var fullString = str;

    caseSensitive = caseSensitive || false;
    offset = offset || 0;

    if (!caseSensitive) {
        fullString = fullString.toLowerCase();
        searchStart = searchStart.toLowerCase();
        searchEnd = searchEnd.toLowerCase();
    }

    var startPosition = fullString.indexOf(searchStart, offset);
    if (startPosition > -1) {
        var endPosition = fullString.indexOf(searchEnd, startPosition + 1);
        if (endPosition > -1) {
            return str.substr(startPosition + searchStart.length, endPosition - startPosition - searchEnd.length + 1);
        }
    }
    return false;
}

> var htmlString = '<div class="aa">TextOne</div><ul><li>one</li></ul>';

> str_between(htmlString, '<ul>', '</ul>');
"<li>one</li>"

> str_between(htmlString, '<UL>', '</UL>');
"<li>one</li>"

> str_between(htmlString, '<UL>', '</UL>', true);
false
于 2013-10-28T14:16:51.480 回答