正则表达式替换所有出现的 li 标签
Regex to replace all occurrences of li tags
我想用“\par {\pntext\f1 ''B7\tab}”替换字符串中所有出现的 li 标签,然后将标签中的任何数据附加到它的末尾。
基本上将html转换为rtf格式。
例如
<ul><li>list1 line1</li></ul>
<ul><li><span>list2 line1</span></li></ul>
最后我想删除所有的 ul 标签
function convertHtmlToRtf(html) {
var richText = html;
richText = richText.replace(/<(?:b|strong)(?:\s+[^>]*)?>/ig, "{\b\n");
return richText;
}
你的问题有点宽泛,但既然你说你正在使用 javascript 并且想要一个正则表达式。然后我假设你有一个字符串,并想用给定的字符串替换 <li></li>
对。还假设你的 HTML 总是非常简单和可预测的(在 <li>
s 内没有 <li>
s),那么你可以这样做:
var str = "<ul><li>list1</li></ul>\n<ul><li><span>list2 line1</span></li></ul>";
str.replace(/<li( [^>]*){0,1}>(.*)<\/li>/, "\par {\pntext\f1 ''B7\tab} ");
这里我使用匹配一对 <li>
的正则表达式,并用那个神奇的字符串替换它们,但保留里面的任何内容(请注意,您可以轻松扩展它以删除 ul
如有必要。最终结果:
<ul>\par {\pntext1 ''B7\tab} list1</ul>
<ul>\par {\pntext1 ''B7\tab} <span>list2 line1</span></ul>
现在您可以立即注意到它不会删除里面的标签 - 所以 <span>
会留在那儿。如果您可以使用 jQuery,那么正确转换节点可能比使用正则表达式(可能会变得非常复杂)更容易
编辑:
既然已经阐明了 jQuery
可以用来帮助解析,那么这里有一个简单的例子来说明如何使用它:
https://jsfiddle.net/nazy8sc6/2/
var html = "<ul><li>list1 <b>line1</b></li></ul><ul><li><span>list2 line1</span></li></ul>";
var TAB_STR = "\par {\pntext1 ''B7\tab}";
function convertLi(parent, node) {
var convertedText = TAB_STR + " " + $(node).text() + "<br>";
var convertedNode = $('<span></span>').html(convertedText);
$(parent).append(convertedNode);
}
function convertHtmlToRtf(html) {
var result = $('<span></span>');
$(html).find('li').each((_, node) => {
convertLi(result, $(node));
})
return result.html().replace(/<br \>/g, "\n");
}
var res = convertHtmlToRtf(html);
console.log(res);
在此解决方案中,您只需找到所有 <li>
标签并从中提取内容 - 我始终保留原始 HTML 并将转换后的内容复制到新的 HTML 我们最终从中提取完全转换的文本。希望这对你有帮助,但如果我没有很好地解释自己,请告诉我。
我想用“\par {\pntext\f1 ''B7\tab}”替换字符串中所有出现的 li 标签,然后将标签中的任何数据附加到它的末尾。
基本上将html转换为rtf格式。
例如
<ul><li>list1 line1</li></ul>
<ul><li><span>list2 line1</span></li></ul>
最后我想删除所有的 ul 标签
function convertHtmlToRtf(html) {
var richText = html;
richText = richText.replace(/<(?:b|strong)(?:\s+[^>]*)?>/ig, "{\b\n");
return richText;
}
你的问题有点宽泛,但既然你说你正在使用 javascript 并且想要一个正则表达式。然后我假设你有一个字符串,并想用给定的字符串替换 <li></li>
对。还假设你的 HTML 总是非常简单和可预测的(在 <li>
s 内没有 <li>
s),那么你可以这样做:
var str = "<ul><li>list1</li></ul>\n<ul><li><span>list2 line1</span></li></ul>";
str.replace(/<li( [^>]*){0,1}>(.*)<\/li>/, "\par {\pntext\f1 ''B7\tab} ");
这里我使用匹配一对 <li>
的正则表达式,并用那个神奇的字符串替换它们,但保留里面的任何内容(请注意,您可以轻松扩展它以删除 ul
如有必要。最终结果:
<ul>\par {\pntext1 ''B7\tab} list1</ul>
<ul>\par {\pntext1 ''B7\tab} <span>list2 line1</span></ul>
现在您可以立即注意到它不会删除里面的标签 - 所以 <span>
会留在那儿。如果您可以使用 jQuery,那么正确转换节点可能比使用正则表达式(可能会变得非常复杂)更容易
编辑:
既然已经阐明了 jQuery
可以用来帮助解析,那么这里有一个简单的例子来说明如何使用它:
https://jsfiddle.net/nazy8sc6/2/
var html = "<ul><li>list1 <b>line1</b></li></ul><ul><li><span>list2 line1</span></li></ul>";
var TAB_STR = "\par {\pntext1 ''B7\tab}";
function convertLi(parent, node) {
var convertedText = TAB_STR + " " + $(node).text() + "<br>";
var convertedNode = $('<span></span>').html(convertedText);
$(parent).append(convertedNode);
}
function convertHtmlToRtf(html) {
var result = $('<span></span>');
$(html).find('li').each((_, node) => {
convertLi(result, $(node));
})
return result.html().replace(/<br \>/g, "\n");
}
var res = convertHtmlToRtf(html);
console.log(res);
在此解决方案中,您只需找到所有 <li>
标签并从中提取内容 - 我始终保留原始 HTML 并将转换后的内容复制到新的 HTML 我们最终从中提取完全转换的文本。希望这对你有帮助,但如果我没有很好地解释自己,请告诉我。