【问题标题】:Matching only the beginning anchor of a multiline string仅匹配多行字符串的开始锚点
【发布时间】:2015-07-27 20:40:52
【问题描述】:
var s = "1. TLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, \

2.  quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse \

3. whatever..."

s.replace('/^\d\.\s+/gm','</li><li>')

我正在尝试将从 MS Word 复制的列表结构转换为 HTML 列表。我知道^ 可以匹配“字符串开头”锚点,他正则表达式/^\d\.\s+/gm 将匹配每个新行。但是我需要区分第一个新行,这是唯一的“整个字符串的开头”锚点,也就是将/^\d\.\s+/ 的第一个匹配替换为&lt;ol&gt;&lt;li&gt;,有没有一般的方法可以做到这一点?

【问题讨论】:

  • 你在用javascript吗?

标签: javascript regex multilinestring


【解决方案1】:

不要通过连接字符串来构建 HTML。这不安全(想想特殊字符和 XSS)。

怎么样:

var s = "1. TLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, \n\
\n\
2.  quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse \n\
\n\
3. whatever..."

var ul = document.createElement("UL");

s.replace(/^\s*$\n/gm, "").split(/\n/g).map(function (txt) {
    var li = document.createElement("LI");
    li.textContent = txt.replace(/^\s+|\s+$/g, "");
    return li;
}).forEach(function (li) {
    ul.appendChild(li);
});

如果您不想手动构建 DOM 元素,请使用成熟的 HTML 模板库之一(例如 Handlebars)。

【讨论】:

    【解决方案2】:

    您可以使用捕获组将字符串放在 2 \d.\d\. 之间,并以 &lt;/li&gt;$1&lt;li&gt; 结尾(将第一组放在列表标签​​之间):

    s.replace('/^\d\.(.+)(\d\.|$)/gm','/</li>$1<li>/')
    

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多