正则表达式替换所有出现的 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 我们最终从中提取完全转换的文本。希望这对你有帮助,但如果我没有很好地解释自己,请告诉我。