Я перебираю массив и пытаюсь найти родительские элементы 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>
Вы не позаботитесь о том, чтобы совместить элемент "FieldName =" Location ID "в своем комментарии, поэтому ваше регулярное выражение не соответствует.
Другое дело, очень сложно (иногда невозможно) обрабатывать html с регулярным выражением, подумайте об использовании парсера.
Лучший способ - фактически пройти дерево DOM вместо регулярного выражения, просматривающего его представление строки HTML.
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);
Попробуй это:
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/....