使用jQuery和替换字符串值时遇到困难



我目前正在开发一个发布功能[比如What's on your mind],我在其中使用twemoji插件制作表情符号。出于某些安全原因,在表情符号存储到数据库之前,我必须将其转换为alt代码/图像文件名。

并在提要上显示时将其转换回图像。

在我的情况下,我使用[表情符号=filename.png]例如,我有以下字符串:

var string = "[emoji=1f938.png] [emoji=1f938-200d-2642-fe0f.png] [emoji=26f9-fe0f.png]";
string.replace(/-fe0f.png/g, '.png')
.replace(/[emoji=(.*?)]/g,'<img src="https://example.net/images/$1">');

上面的代码段运行良好,但唯一的问题是它删除了文件名中的所有-fe0f.png,这会导致一些图像损坏。

我想要实现的是删除-fe0f.png部分,仅当文件名长度为<=14.或者,如果文件名由以下内容组成:(char(-fe0f.png,但如果它有更多的(char((char(-(char(-fe0f.png,它应该仍然保持不变。。

结果应该是:

来自

[emoji=1f938.png] [emoji=1f938-200d-2642-fe0f.png] [emoji=26f9-fe0f.png]

[emoji=1f938.png] [emoji=1f938-200d-2642-fe0f.png] [emoji=26f9.png]

更新:

我刚刚注意到有这样的文件名30-fe0f-20e3.png但它需要去掉中间的-fe0f。因此,而不是[表情符号=30-fe0f-20e3.png]

我需要[表情符号=30-20e3.png]

文件名长度限制等于十四。因此,应该存在";九";"前面的字符-fe0f";

  • CCD_ 1表示除"=">
  • CCD_ 2意味着必须不存在"="在";a">
  • CCD_ 3意味着它不能具有"0"="在字母"之前的九个字符期间的字符;a">
  • CCD_ 4意味着它不能具有"0"="字符之前的九个字符期间的"-fe0f.png">

所以你的新代码应该如下所示:

var string = "[emoji=1f938.png] [emoji=1f938-200d-2642-fe0f.png] [emoji=26f9-fe0f.png]";
string.replace(/(?<![^=]{9})-fe0f.png/g, '.png')
.replace(/[emoji=(.*?)]/g,'<img src="https://example.net/images/$1">');

替换示例字符串中的数据:

const regex = /([emoji=[^s][]{0,13})-fe0f(.png)/g;
let string = "[emoji=1f938.png] [emoji=1f938-200d-2642-fe0f.png] [emoji=26f9-fe0f.png]";
string = string.replace(regex, '$1$2');
console.log(string);

您可以在一个替换调用中使用匹配和捕获组进行替换,匹配emoji=后的0-13个字符

[emoji=([^s][]{0,13})-fe0f.png]

模式匹配:

  • [emoji=匹配[emoji=
  • (捕获组1
    • [^s][]{0,13}将除[^=]0和]之外的非空白字符匹配0-13次
  • )关闭组1
  • -fe0f.png]字面匹配(注意转义点(

regex演示

const regex = /[emoji=([^s][]{0,13})-fe0f.png]/g;
let string = "[emoji=1f938.png] [emoji=1f938-200d-2642-fe0f.png] [emoji=26f9-fe0f.png]";
string = string.replace(regex, '<img src="https://example.net/images/$1.png">');
console.log(string);

如果您只是试图不替换超过14个字符,那么应该这样做。

if (string.length > 14) {
// do your replace here
}

现在,不确定你是否在暗示,如果有不止一个"-"你也不想取代它。

最新更新