regex 每个新单词的大写瑞典语字符和html标记

50pmv0ei  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(161)

我被指出这篇文章,这似乎不符合我的标准:Replace a Regex capture group with uppercase in Javascript
我正在尝试创建一个正则表达式,它将:

  • 通过为每个单词的首字母添加大写字母并为其余字符添加小写字母来设置字符串的格式
  • 忽略HTML标记
  • 接受瑞典语字符(åäöÅÖ)

假设我有这个字符串:

<b>app</b>le store östersund

然后我希望它是(用大写字符标记的变化)

<b>App</b>le Store Östersund

我一直在玩它,我得到的最接近的是以下内容:
(?!([^<])*?>)|\s\B\w
导致

<b>app</b>le Store Östersund

或者这个
/(?!([^<])*?>)[联系我们]|\S\B\w/g
导致

<B>App</B>Le store Östersund
5ktev3wc

5ktev3wc1#

只使用regexp是不可能做到这一点的,因为regexp不理解HTML结构。[*]相反,我们需要处理每个文本节点,并执行我们的逻辑,以确定单词的开头,以防单词在不同的文本节点之间继续。如果一个字符前面有一个空格,或者它位于字符串的开头,并且它是第一个文本节点,或者是以空格结尾的前一个文本节点,则该字符位于单词的开头。

function htmlToTitlecase(html, letters) {
  let div = document.createElement('div');
  let re = new RegExp("(^|\\s)([" + letters + "])", "gi");
  div.innerHTML = html;
  let treeWalker = document.createTreeWalker(div, NodeFilter.SHOW_TEXT);
  let startOfWord = true;
  while (treeWalker.nextNode()) {
    let node = treeWalker.currentNode;
    node.data = node.data.replace(re, function(match, space, letter) {
      if (space || startOfWord) {
        return space + letter.toUpperCase();
      } else {
        return match;
      }
    });
    startOfWord = node.data.match(/\s$/);
  }
  return div.innerHTML;
}

console.log(htmlToTitlecase("<b>app</b>le store östersund", "a-zåäö"));
// <b>App</b>le Store Östersund

[*]也许有可能,但即使如此,它也会非常丑陋,因为它需要覆盖大量的角落案例。还可能需要比JavaScript更强大的RegExp引擎,比如Ruby或Perl。

编辑

即使只是指定非常简单的html标签?目前我真正需要覆盖的只有<b></b>
问题中没有具体说明这一点。该解决方案足够通用,可以用于任何标记(包括简单的标记)。但是...

function simpleHtmlToTitlecaseSwedish(html) {
  return html.replace(/(^|\s)(<\/?b>|)([a-zåäö])/gi, function(match, space, tag, letter) {
    return space + tag + letter.toUpperCase();
  });
}
console.log(simpleHtmlToTitlecaseSwedish("<b>app</b>le store östersund", "a-zåäö"));
ev7lccsx

ev7lccsx2#

我有一个几乎只使用正则表达式的解决方案。这可能不是最直观的方法,但它应该是有效的,我觉得很有趣:)
你必须在字符串的末尾附加每个小写字符,后面跟着对应的大写字符,就像这样(它前面还必须有一个空格来表示我的正则表达式):
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZåÅäÄöÖ
(我不知道哪些字母不见了,我对瑞典字母一无所知,对不起。我就指望你来纠正了!)
然后你可以使用下面的正则表达式:
(?![^<]*>)(\s<[^/]*?>|\s|^)([\wåäö])(?=.*\2(.)\S*$)|[\wåÅäÄöÖ]+$
替换为:
$1$3
测试here

下面是一个工作的javascript代码:

// Initialization
var regex = /(?![^<]*>)(\s<[^/]*?>|\s|^)([\wåäö])(?=.*\2(.)\S*$)|[\wåÅäÄöÖ]+$/g;
var string = "test <b when=\"2>1\">ap<i>p</i></b>le store östersund";

// Processing
result = string + " aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZåÅäÄöÖ";
result = result.replace(regex, "$1$3");

// Display result
console.log(result);

**编辑:**我忘记处理字符串的第一个单词,已更正:)

相关问题