Соответствие текста в HTML без содержимого тега - PullRequest
1 голос
/ 07 апреля 2009

Я ищу регулярное выражение для Javascript для поиска текста (например, "span") в HTML.

Пример:

<div>Lorem span Ipsum dor<a href="blabla">la бла la</a> dsad <span>2</span> ... </div>

НО должен совпадать только "span" после "Lorem", а не тег <span>.
Во втором примере, если мы ищем «bla», должен соответствовать только текст, выделенный жирным шрифтом.

РЕДАКТИРОВАТЬ:

HTML получен innerHTML, совпадения будут окружены <span class="x">$text</span>, затем переписаны в innerHTML этого узла, и все это без уничтожения других тегов.

EDIT2 и мое решение:

Я написал свой собственный поиск, он ищет char по char, с кешем и флагами.

Спасибо за помощь, ребята!

Ответы [ 8 ]

2 голосов
/ 07 апреля 2009

Вы можете использовать методы dom для обработки каждого текстового узла.

Этот метод принимает родительский узел для первого аргумента и перебирает все его дочерние узлы, обработка текстовых узлов функцией, переданной в качестве второго аргумента. Функция, где вы будете работать с данными тестового узла, например, чтобы найти, заменить, удалить или обернуть найденный текст в выделенный интервал.

Вы можете вызвать функцию только с первым аргументом, и она вернет массив текстовые узлы, и вы можете использовать этот массив для управления текстом элементы массива в этом случае являются узлами и имеют данные, родителей и братьев и сестер.

document.deepText= function(hoo, fun){
    var A= [], tem;
    if(hoo){
        hoo= hoo.firstChild;
        while(hoo!= null){
            if(hoo.nodeType== 3){
                if(fun){
                    if((tem= fun(hoo))!== undefined){
                       A[A.length]= tem;
                    }
                }
                else A[A.length]= hoo;
            }
            else A= A.concat(arguments.callee(hoo, fun));
            hoo= hoo.nextSibling;
        }
    }
    return A;
}

// контрольный пример

function ucwords(pa, rx){
    var f= function(node){
        var t= node.data;
        if(t && t.search(rx)!=-1){
            node.data= t.replace(rx,function(w){return w.toUpperCase()});
            return node;
        }
        return undefined;
    }
    return document.deepText(pa, f);
}

ucwords (document.body, / \ bspan \ б / мкг)

1 голос
/ 08 апреля 2009
/span(?=[^>]*<)/

Другими словами, если смотреть вперед от конца слова «span», то перед следующей открывающей угловой скобкой нет закрывающей угловой скобки, поэтому мы не можем находиться внутри тега. Возможно, значения атрибутов в кавычках могут содержать закрывающие угловые скобки, хотя я никогда не видел, чтобы это было сделано. Но, чтобы покрыть эту возможность, вы можете использовать это регулярное выражение:

/span(?=(?:[^>"']+|"[^"]*"|'[^']*')*<)/
1 голос
/ 07 апреля 2009

То, что вы хотите сделать, можно сделать довольно легко с помощью jQuery:

  $("span:contains('blah'))

Если вы хотите сопоставить регулярное выражение, сделайте то, что было сделано в предыдущем примере переполнения стека:

Регулярные выражения jQuery

Для более элегантного решения создайте пользовательский селектор .

1 голос
/ 07 апреля 2009
(?<!\<|/)span

Это должно дать все вхождения диапазона, которые не являются тегами. Надеюсь, это помогло хоть немного:)

Объяснение: найдите каждое span вхождение, которое не , которому предшествует < или /

1 голос
/ 07 апреля 2009

Если у вас есть HTML в элементе DOM, вы можете использовать textContent / innerText для захвата текста (без каких-либо тегов HTML):

var getText = function(el) {
    return el.textContent || el.innerText;
};
// usage:
// <div id="myElement"><span>Lorem</span> ipsum <em>dolor<em></div>
alert(getText(document.getElementById('myElement'))); // "Lorem ipsum dolor"
0 голосов
/ 10 мая 2013

** найдено НОВОЕ РЕШЕНИЕ с использованием прогнозов

 var pageHTML ="  <span aa span > span asa span";
 var regex = "span(?!([^<]+)?>)";

это регулярное выражение найдет слово "span" только в том случае, если у него нет "<", то после него стоит ">".

** старое решение

Вот мое решение, я ищу "asd", и если вокруг него есть открытые и закрытые теги, я игнорирую это совпадение.

Я делаю это, глядя вправо и влево от совпадающего слова, если я обнаружил, что оно заключено в теги, я возвращаю то же самое совпадающее слово «Я не заменяю», если нет, я заменяю текст мне нужен

    var pageHTML ="  < aa asd > asd < asd";
    var regex = "asd";
    var pattern = new RegExp(regex, "gi");
    var replaceWord = "dsa";

    //Replace all instances of word/words with our special spans
    pageHTML = pageHTML.replace(pattern, function(match, index, original){
        var leftIndex = index;  
        var rightIndex = parseInt(parseInt(index)+match.length);

        var insideTag = false;
        var foundOpenTag = false;

        for(; leftIndex > 0; leftIndex--){
           if(pageHTML.charAt(leftIndex) == ">")
               break;
           if(pageHTML.charAt(leftIndex) == "<"){
                   foundOpenTag = true;
                   break;
               }
        }

        if(!foundOpenTag){
            return replaceWord;
        }

      for(; rightIndex < pageHTML.length ; rightIndex++){
           if(pageHTML.charAt(rightIndex) == "<")
               break;
           if(pageHTML.charAt(rightIndex) == ">" ){
                   insideTag = true;
                   break;
               }
        }
        if(insideTag)
            return match;
        else return replaceWord;


            });

предупреждение (pageHTML);

0 голосов
/ 07 апреля 2009

Это может быть невозможно в общем случае, потому что вам нужно будет считать открывающие и закрывающие теги, что невозможно с регулярными выражениями.

Regex не является умным решением для обработки XML. Вместо этого вы должны использовать методы HTML или XML DOM для извлечения необходимой информации.

Если вы действительно хотите или должны использовать регулярные выражения, вы можете попробовать что-то вроде следующего.

>[^<]*bla[^<]*<

Но я совершенно уверен, что в общем случае это не сработает.

0 голосов
/ 07 апреля 2009

Если я вас правильно понимаю, вы хотите найти слово, но только слова, которые не являются частью HTML-тега.

У меня нет точного ответа для вас, но некоторые инструменты, которые я использую для разработки регулярных выражений, это сайт: http://www.regular -expressions.info / и эта программа: http://www.radsoftware.com.au/regexdesigner/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...