【发布时间】:2019-06-07 12:15:18
【问题描述】:
我正在尝试使用 JavaScript 搜索所有 p 元素以查找正则表达式,但我要查找的文本可能部分存在或不存在于属性元素中或包含在跨度中。最终,我计划通过添加一个引用我之前用 JavaScript 插入的 html id 的属性元素来修复在 Word 中应用于 Word 项目符号项的 HTML 代码中的交叉引用。
我的总体项目是创建一个 Word 文档,我使用“另存为”功能让 Word 创建一个过滤的 HTML 文件。我最终使用 JavaScript 来插入 id 和标签,以便我可以利用 CSS 文件来标准化我所有 HTML 文件的格式。因此,我对初始 HTML 代码的控制有限。
到目前为止,我已经能够创建一个遍历所有 p 元素的循环。在循环中,我可以为“/Step (\d+)/”的 innerText 上的正则表达式执行条件语句,因为我希望文本看起来像第 1 步、第 12 步或任何其他数字。下面的代码似乎成功输入了 if 语句。我在使用 innerHTML 部分的替换函数时遇到了问题,因为 innerText 与表达式匹配,但 innerHTML 包含阻止我正在寻找的最终结果的元素。我希望能够概括地解释任何其他元素,例如粗体、斜体、a 等。为此,我尝试使用多个 if 语句来替换各种潜在的 HTML 条件。
我试图通过对文本应用粗体来确定这项技能,以确保我了解如何完成此特定功能。到目前为止,我所做的所有搜索都有助于使正则表达式与 innerText 匹配,但我找不到方法或忽略无关的 html 代码。我在想可能可以用新的 HTML 代码存储替换的 innerText,然后将其设为新的 innerHTML,但是我想要维护的 p 元素中可能还有其他格式。
通过我使用第二个正则表达式进行 innerHTML 替换的方法,贪婪搜索似乎我会捕获错误结果,即使正则表达式正在捕获它。
HTML
<p id="FirstPara" class=firstpara>This is a header</p>
<p class=firstpara>This is a reference to Step <span lang=HE>‎ </span><b>1</b>.</p>
<p class=firstpara>This is a reference to Step <span lang=HE>‎</span>2.</p>
<p class=firstpara>This is a reference to Step <span lang=HE>‎</span>1 and Step <span lang=HE>‎</span>2.</p>
JavaScript 函数
function findTheText() {
regExp1 = /Step (\d)/g;
for (var i = 0; i < document.getElementsByTagName('p').length; i++) {
alert(i+" - "+j+" - "+document.getElementsByTagName('p')[i].innerHTML+" - "+results[j]);
var results = document.getElementsByTagName('p')[i].innerText.match(regExp1);
if (results !== null) {
for (var j = 0; j < results.length; j++) {
var replace = results[j].replace(/Step\s/,"");
var regExp2 = new RegExp('Step\s'+replace,"i");
var regExp3 = new RegExp('Step\s.*>'+replace,"i");
var regExp4 = new RegExp('Step\s.*>.*>'+replace,"i");
var results2 = document.getElementsByTagName('p')[i].innerText.match(regExp2);
var results3 = document.getElementsByTagName('p')[i].innerText.match(regExp3);
var results4 = document.getElementsByTagName('p')[i].innerText.match(regExp4);
if (results2 !== null) {
document.getElementsByTagName('p')[i].innerHTML.replace(regExp2, "<b>"+results[j]+"</b>");
} else if (results3 !== null) {
document.getElementsByTagName('p')[i].innerHTML.replace(regExp3, "<b>"+results[j]+"</b>");
} else if (results4 !== null) {
document.getElementsByTagName('p')[i].innerHTML.replace(regExp4, "<b>"+results[j]+"</b>");
}
}
}
}
}
到目前为止,代码将找到我想要的文本,但由于正则表达式匹配我正在寻找的字符串,但 innerHTML 没有我没有在文本上实现粗体(或最终属性)。
预期的 HTML 输出
<p class=firstpara>This is a reference to <b>Step 1</b>.</p>
<p class=firstpara>This is a reference to <b>Step 2</b>.</p>
<p class=firstpara>This is a reference to <b>Step 1</b> and <b>Step 2</b>.</p>
【问题讨论】:
-
我遇到的问题是
Step和数字之间的span包含一个字符,所以最初的/Step (\d)/模式失败:jsfiddle.net/j8yxwa2p 也许首先删除所有@ 987654328@标签? -
我正在考虑的一个选项是通过 VBA 脚本运行 html 代码以尝试清除该文本,但我想我会遇到同样的问题,因为这些只是原始html代码中可能包含什么。我将对这些额外的 HTML 项目进行一些控制,因为我计划在创建 Word 文档时使用一些标准化,但我预计可能会有其他情况。我在问题中添加了一个示例,除了整个 Step # 也应该是粗体的跨度之外,只有数字是粗体的。这就是我对“if”正则表达式的希望。
-
span里面可以有嵌套标签吗?如果没有,那么在他们周围匹配
Steps 并根据需要替换并不难 -
我不相信我应该在跨度内看到额外的嵌套标签。我相信 Word 生成了这些,因为我在生成 HTML 之前在 Word 文档中创建了交叉引用。我知道必须在为我的情况生成之前添加这些交叉引用。我真正期待的唯一其他标签是我在示例中添加的粗体。
标签: javascript html regexp-replace