&nbsp|&quot|&amp|&lt|&gt|&ldquo|&rdquo等html转义字符查询以及JavaScript string 的replace

本文介绍如何解决Weex应用中JSON数据包含转义字符的问题,通过自定义正则表达式过滤函数实现转义字符的有效转换。
ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

前言

最近学习Weex,写了点东西,有个问题就是json输出有&nbsp|&quot|&amp|&lt|&gt等转义字符,如果你是web直接搞,那么直接用v-html输出即可。但是Weex的网站你看一下

OK,没办法了,只能通过正则来做

下面先贴上我的结果代码,看完代码可以继续往下,查看思路,代码主要用来过滤

export const rexFilter = (originString) => {
    var result = originString.replace(/&([^&;]+);/g, function(matchStr, b) {
        var entity = {
            quot: '"',
            lt: '<',
            gt: '>',
            apos: "'",
            amp: '&',
            ldquo: '“',
            rdquo: '”'
        };
        var r = entity[b];
        return typeof r === 'string' ? r : matchStr;
    });
    return result;
}

例如后台返回的的字符串是

宓珂璟&rdquo我母鸡啊&ldquo我真的&lt母鸡&gt啊

如果你直接

<template recyclable>
    <div class="main-con" @click="onCardClick">
        <text class="detail-text-top">{{title}}</text>
        <text class="detail-text-bottom">{{itemValue.publishTimeString}}</text>
    </div>
</template>

按titile插入输出,他只会原样输出,不会进行转义,而且weex不支持v-html,因此只能通过上面的方法进行正则

    data() {
        return {
            title: rexFilter(this.itemValue.title)
        }
    },

在script标签中用titile绑定即可,对应的值就是过滤后的,输出为

宓珂璟“我母鸡啊”我真的<母鸡>啊

JavaScript string 的replace

点击打开链接

在使用JavaScript对字符串进行处理的时候我们经常会用到replace方法,很简单的一个方法,以前一直不以为意,直到今天看JavaScript语言精粹的时候读到了一个有趣的小例子的时候,并不是十分理解,了解了一下replace的用法才明白,原来replace不像想象中的那么简单。

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

语法:string.replace(subStr/reg,replaceStr/function)

第一个参数可以是字符串的子字符串,也可以是一个正则表达式,第二个参数可以是一个字符串或者一个处理方法,下面我们分别看看

document.write('1234'.replace(1, 'X'));
我们可以得到结果:X234,很正常,但是
document.write('1214'.replace(1, 'X'));

我们预想结果应该是:X2X4,但是得到的结果却是:X214,也就是说如果我们第一个参数写的是子字符串,那么replace只替换第一个匹配就停止搜索

我们换为正则的写法

document.write('1214'.replace(/1/g, 'X'));

这时候我们可以得到预想结果:X2X4

我们看看function的写法

var r = 'abcd'.replace(/\w/g, function() {
            return 'X';
        });
        document.write(r);

这时我们可以看到预想结果:XXXX,所有字符被替换为X,这是我之前对replace的认识,但我在JavaScript语言精粹上看到这样一个例子,我迷惑了

var t = document.getElementById('t');
        String.prototype.deentityfy = function() {
            var entity = {
                quot: '"',
                lt: '<',
                gt: '>'
            };
            return function() {
                return this.replace(/&([^&;]+);/g, function(a, b) {
                   var r = entity[b];
                    return typeof r === 'string' ? r : a;
                }); //end of replace
            };
        } ();

        document.write('<">'.deentityfy());

这段代码是为JavaScript的String对象添加一个deentityfy 方法,用以替换字符串中得HTML字符(把&quot;替换为”,&lt;替换为<,&gt;替换为>),我们先忽略作者使用的语言技巧,看看他的replace是怎么用的,第一个参数是一个正则表达式,是匹配之前提到的三个字符串,第二个参数的function竟然有了两个参数,这两个参数到底是什么?为什么方法却得到了预想结果,我们来简单分析一下。

首先entity[b]是JavaScript关联数组的用法,根据数组数据的name得到value,为了方便理解,我们不妨改造一下这个方法,让它变得简单些,让我们可以更清楚地看到function的参数到底是什么,同时为了消除浏览器转码问题,我们修改一下替换字符串

String.prototype.deentityfy = function() { 
         var entity = { 
             a: 'A', 
             b: 'B', 
             c: 'C' 
         }; 
         return function() { 
             return this.replace(/1([^12])2/g, function(a, b) { 
                 for (var i = 0; i < arguments.length; i++) { 
                     document.write(arguments[i] + '<br/>'); 
                 } 
                 document.write('===========================<br/>'); 
                 var r = entity[b]; 
                 return typeof r === 'string' ? r : a; 
             }); //end of replace 
         }; 
     } ();

     document.write('1a21b21c2'.deentityfy());
1a2 
a 
0 
1a21b21c2 
=========================== 
1b2 
b 
3 
1a21b21c2 
=========================== 
1c2 
c 
6 
1a21b21c2 
=========================== 
ABC

很奇怪对不对,最后的<”>是方法的结果,很正确,得到了预期结果,让我们看看function的参数部分,

function被调用了3次,恰恰是匹配的次数,每次都置换匹配字符串。

每次调用的时候方法有四个参数

第一个参数很简单,是匹配字符串

第二个很诡异,不过每个都看一遍不难得出,第二个参数是正则表达式括号内的匹配的内容(分组内容)

第三个参数和容易想到,是匹配项在字符串中的index

第四个参数则是原字符串

很神奇对不对,但是不是就是这样了呢,我们再写一个试试

var r = '1a21b21c2'.replace(/1\w2/g, function() {
            for (var i = 0; i < arguments.length; i++) {
                document.write(arguments[i] + '<br/>');
            }
            document.write('===========================<br/>')
            return 'X';
        });
        document.write(r);
和前面例子很像,只是简单的把所有匹配项替换为了X,看看结果
1a2
0
1a21b21c2
===========================
1b2
3
1a21b21c2
===========================
1c2
6
1a21b21c2
===========================
XXX
出乎意料对不对,结果是预期的,但是参数少了一个,第二项参数不见了,看看究竟还有什么不同——正则表达式中看似多余的括号不见了,上一个例子中,第二项参数恰恰是括号内的匹配项(熟悉正则表达式的同学清楚,括号使分组用的),是不是第二个参数就是正则表达式中括号内的匹配项呢,我们把括号加回来验证一下

var r = '1a21b21c2'.replace(/1(\w2)/g, function() {
            for (var i = 0; i < arguments.length; i++) {
                document.write(arguments[i] + '<br/>');
            }
            document.write('===========================<br/>')
            return 'X';
        });
        document.write(r);
1a2
a2
0
1a21b21c2
===========================
1b2
b2
3
1a21b21c2
===========================
1c2
c2
6
1a21b21c2
===========================
XXX
果不其然,这样我们就了解了function中到底有哪些参数,现在看看JavaScript语言精粹重的例子就应该明白了,当然我们需要知道关联数组,立即执行函数,闭包和arguments对象,如果让我们把一句话中所有的单词首字母大写,是不是会了呢

//方法很多,这个只是验证我们刚才的理论才故意写成这样麻烦的做法
 var sentence = 'i love you';
        var upper = sentence.replace(/(\w)\w*\b/g, function(a,b) {
            return b.toUpperCase()+a.substring(1);
        });
        document.write(upper);
//这样写其实已经可以胜任
  var sentence = 'i love you';
        var upper = sentence.replace(/\w+\b/g, function(a) {
            return a.substr(0,1).toUpperCase()+a.substring(1);
        });
        document.write(upper);

下面是HTML最全的转义图标,自己查询用的,可以忽略它

转义字符图标

No.文字表記10進表記16進表記文字
Comment
001&quot;&#34;&#x22;"""
quotation mark = APL quote
002&amp;&#38;&#x26;"&"
ampersand
003&lt;&#60;&#x3C;"<"
less-than sign
004&gt;&#62;&#x3E;">"
greater-than sign
005&nbsp;&#160;&#xA0;" "
no-break space = non-breaking space
char glyphHTML tag
 &nbsp;
¡&iexcl;
¢&cent;
£&pound;
¤&curren;
¥&yen;
¦&brvbar;
§&sect;
¨&uml;
©&copy;
ª&ordf;
«&laquo;
¬&not;
 &shy;
®&reg;
¯&macr;
°&deg;
±&plusmn;
²&sup2;
³&sup3;
´&acute;
µ&micro;
&para;
·&middot;
¸&cedil;
¹&sup1;
º&ordm;
»&raquo;
¼&frac14;
½&frac12;
¾&frac34;
¿&iquest;
À&Agrave;
Á&Aacute;
Â&Acirc;
Ã&Atilde;
Ä&Auml;
Å&Aring;
Æ&AElig;
Ç&Ccedil;
È&Egrave;
É&Eacute;
Ê&Ecirc;
Ë&Euml;
Ì&Igrave;
Í&Iacute;
Î&Icirc;
Ï&Iuml;
Ð&ETH;
Ñ&Ntilde;
Ò&Ograve;
Ó&Oacute;
Ô&Ocirc;
Õ&Otilde;
Ö&Ouml;
×&times;
Ø&Oslash;
Ù&Ugrave;
Ú&Uacute;
Û&Ucirc;
Ü&Uuml;
Ý&Yacute;
Þ&THORN;
ß&szlig;
à&agrave;
á&aacute;
â&acirc;
ã&atilde;
ä&auml;
å&aring;
æ&aelig;
ç&ccedil;
è&egrave;
é&eacute;
ê&ecirc;
ë&euml;
ì&igrave;
í&iacute;
î&icirc;
ï&iuml;
ð&eth;
ñ&ntilde;
ò&ograve;
ó&oacute;
ô&ocirc;
õ&otilde;
ö&ouml;
÷&divide;
ø&oslash;
ù&ugrave;
ú&uacute;
û&ucirc;
ü&uuml;
ý&yacute;
þ&thorn;
ÿ&yuml;
char glyphHTML tag
ƒ&fnof;
char glyphHTML tag
"&quot;
&&amp;
<&lt;
>&gt;

char glyphHTML tag
&larr;
&uarr;
&rarr;
&darr;
&harr;
&crarr;
&lArr;
&uArr;
&rArr;
&dArr;
&hArr;
char glyphHTML tag
Œ&OElig;
œ&oelig;
Š&Scaron;
š&scaron;
Ÿ&Yuml;
char glyphHTML tag
ˆ&circ;
˜&tilde;
char glyphHTML tag
&forall;
&part;
&exist;
&empty;
&nabla;
&isin;
&notin;
&ni;
&prod;
&sum;
&minus;
&lowast;
&radic;
&prop;
&infin;
&ang;
&and;
&or;
&cap;
&cup;
&int;
&there4;
&sim;
&cong;
&asymp;
&ne;
&equiv;
&le;
&ge;
&sub;
&sup;
&nsub;
&sube;
&supe;
&oplus;
&otimes;
&perp;
&sdot;
char glyphHTML tag
 &ensp;
 &emsp;
 &thinsp;
&zwnj;
&zwj;
&lrm;
&rlm;
&ndash;
&mdash;
&lsquo;
&rsquo;
&sbquo;
&ldquo;
&rdquo;
&bdquo;
&dagger;
&Dagger;
&permil;
&lsaquo;
&rsaquo;
&euro;
char glyphHTML tag
&bull;
&hellip;
&prime;
&Prime;
&oline;
&frasl;
char glyphHTML tag
&lceil;
&rceil;
&lfloor;
&rfloor;
&lang;
&rang;

char glyphHTML tag
&loz;
char glyphHTML tag
&spades;
&clubs;
&hearts;
&diams;
char glyphHTML tag
&weierp;
&image;
&real;
&trade;
&alefsym;
char glyphHTML tag
Α&Alpha;
Β&Beta;
Γ&Gamma;
Δ&Delta;
Ε&Epsilon;
Ζ&Zeta;
Η&Eta;
Θ&Theta;
Ι&Iota;
Κ&Kappa;
Λ&Lambda;
Μ&Mu;
Ν&Nu;
Ξ&Xi;
Ο&Omicron;
Π&Pi;
Ρ&Rho;
Σ&Sigma;
Τ&Tau;
Υ&Upsilon;
Φ&Phi;
Χ&Chi;
Ψ&Psi;
Ω&Omega;
α&alpha;
β&beta;
γ&gamma;
δ&delta;
ε&epsilon;
ζ&zeta;
η&eta;
θ&theta;
ι&iota;
κ&kappa;
λ&lambda;
μ&mu;
ν&nu;
ξ&xi;
ο&omicron;
π&pi;
ρ&rho;
ς&sigmaf;
σ&sigma;
τ&tau;
υ&upsilon;
φ&phi;
χ&chi;
ψ&psi;
ω&omega;
ϑ&thetasym;
ϒ&upsih;
ϖ&piv;














































您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### JavaScript 中使用正则表达式匹配逻辑运算符 `&amp;&amp;` 和 `||` 在 JavaScript 中,可以使用正则表达式来匹配逻辑运算符 `&amp;&amp;` 和 `||`。以下是一个示例代码,展示如何构造一个正则表达式并使用它进行匹配: ```javascript const regex = /(&amp;&amp;|\|\|)/g; // 匹配逻辑运算符 &amp;&amp; 和 || const str = &quot;if (a &amp;&amp; b || c &amp;&amp; d) { console.log('Matched'); }&quot;; const matches = str.match(regex); console.log(matches); // 输出: [ '&amp;&amp;', '||', '&amp;&amp;' ] ``` 上述代码中,正则表达式 `/(&amp;&amp;|\|\|)/g` 的含义如下: - `&amp;&amp;`:匹配逻辑与运算符。 - `\|\|`:匹配逻辑或运算符,由于 `|` 是特殊字符,因此需要用反斜杠 `\` 进行转义[^1]。 - `()`:用于分组,确保将 `&amp;&amp;` 和 `||` 视为整体。 - `|`:表示逻辑或,用于匹配 `&amp;&amp;` 或者 `||`。 - `g`:全局标志,用于查找字符串中的所有匹配项。 如果需要替换这些逻辑运算符,可以使用 `String.prototype.replace` 方法: ```javascript const str = &quot;if (a &amp;&amp; b || c &amp;&amp; d) { console.log('Matched'); }&quot;; const replacedStr = str.replace(/(&amp;&amp;|\|\|)/g, (match) =&gt; { return match === '&amp;&amp;' ? 'AND' : 'OR'; }); console.log(replacedStr); // 输出: if (a AND b OR c AND d) { console.log('Matched'); } ``` 在上面的代码中,`replace` 方法结合回调函数对匹配到的逻辑运算符进行替换,分别将 `&amp;&amp;` 替换为 `AND`,将 `||` 替换为 `OR`[^1]。 此外,在实际开发中,逻辑运算符通常不会单独出现在字符串中,而是作为代码的一部分存在。如果需要解析复杂的代码逻辑,可能需要借助更强大的工具,例如抽象语法树(AST)解析器[^2]。 ### 注意事项 在某些情况下,逻辑运算符可能被嵌套在其他符号或上下文中,例如括号或变量名中。为了确保正则表达式的准确性,建议测试不同的输入场景,并根据需求调整正则表达式模式[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值