Использование JavaScript Regex для поиска родительского узла html-комментария, содержащего определенный текст

0

Я перебираю массив и пытаюсь найти родительские элементы html (tr & td) тега комментария html, содержащего конкретный текст, соответствующий текущему значению массива.

В приведенном ниже примере я передаю значение myField как dev_LocationID, но он всегда возвращает null. В этом примере я пытаюсь совместить полную строку FieldInternalName = 'dev_LocationID. Я знаю, что текст есть. Что я делаю не так? Любая помощь будет оценена!

myField = 'dev_LocationID';

function fnFindThisField(myField){
    var myFieldInternalName = "FieldInternalName='" +myField+ "'";  
    regexComment = new RegExp(/<!--\s*/myFieldInternalName\s*-->/g);
    targetElement = regexComment.test($('td').html());
    return targetElement;
}

Образец html

<tr>
  <td><H3 ><nobr>Form Label</nobr></td>
  <td class="ms-formbody">  
     <!-- FieldName='Location ID'   FieldInternalName='dev_LocationID'  -->
    <select name="ctl00$dev_LocationID" id="ctl00_dev_LocationID">
    <option value="Please choose...">Please choose...</option>
    <option selected="selected" value="1">Location 1</option>
    <option selected="selected" value="1">Location 2</option>
  </select>
  </td>
</tr>

3 ответа

1

Вы не позаботитесь о том, чтобы совместить элемент "FieldName =" Location ID "в своем комментарии, поэтому ваше регулярное выражение не соответствует.

Другое дело, очень сложно (иногда невозможно) обрабатывать html с регулярным выражением, подумайте об использовании парсера.

0

Лучший способ - фактически пройти дерево DOM вместо регулярного выражения, просматривающего его представление строки HTML.

→ jsFiddle

function searchComments($dom) {
    var comments = [];

    $dom.contents().each(function (idx, node) {
        if (node.nodeType === Node.ELEMENT_NODE) {
            comments = comments.concat(searchComments($(node)));
        } else if (node.nodeType === Node.COMMENT_NODE) {
            comments.push(node);
        }
    });
    return comments;
}

function fnFindThisField(myField) {
    var myFieldInternalName = "FieldInternalName='" + myField + "'";
    var foundCommentNode = null;

    searchComments($(document.body)).every(function (commentNode) {
        if (commentNode.nodeValue.indexOf(myFieldInternalName) !== -1) {
            foundCommentNode = commentNode;
            return false;
        }
        return true;
    });
    return foundCommentNode;
}
console.log(fnFindThisField("dev_LocationID").parentNode);
  • 0
    Очень признателен! Я провел 3 дня, исследуя это (вопреки тому, кто бы ни понизил мой вопрос) безрезультатно. Частично проблема заключается в том, что массив имеет почти 100 значений, как и форма. Таким образом, количество итераций значительно возрастет, поэтому я просто искал совпадение. Я немного поэкспериментирую с вашим предложением.
0

Попробуй это:

myField = 'dev_LocationID';

function fnFindThisField(myField){
    var myFieldInternalName = "FieldInternalName='" +myField+ "'";  
    regexComment = new RegExp("/<!--.+?" + myFieldInternalName +"\s*-->"/g);
    targetElement = regexComment.test($('td').html());
    return targetElement;
}

Ваш код не является законным кодом JavaScript. Строковая переменная, которую вы хотите использовать для создания регулярного выражения, не интерполируется, как вы могли бы подумать. Здесь я просто использую функцию конструктора RegExp которая принимает строку и вручную создает шаблон с помощью конкатенации строк.


Обратите внимание, что разбор HTML с использованием регулярного выражения, скорее всего, будет очень хрупким. Разбор разрешающего HTML-кода с использованием Regex даже невозможен, qaru.site/questions/424/....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню