Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式替换&;与&;amp;_Regex_Perl - Fatal编程技术网

Regex 正则表达式替换&;与&;amp;

Regex 正则表达式替换&;与&;amp;,regex,perl,Regex,Perl,我有一个字符串,它有&像下面的一个 "This R&M & Exapmle  . It is very big & Complicated &146; example." 我想用替换&

我有一个字符串,它有&像下面的一个

"This R&M & Exapmle  . It is very big & Complicated &146; example."
我想用
替换
&
$str=~s/&&/免疫球蛋白提供以下输出

"This R&M & Company  . It is very big & CMM Level3 &146; Organization."
我期待着这次

"This R&M & Company  . It is very big & CMM Level3 &146; Organization."
请帮助我,我不知道如何修复它。

您可以使用负片:


&146和#146,代码>写得不正确。如果您有更多此类错误,请在往返编码之前过滤/替换它们。

我以前找到了一个更好的答案,并采用了发布的代码,将其置于摇篮中,使其成为我自己的,但我似乎在任何地方都找不到该帖子

不管怎样,这是我从中得出的解决方案

现在,编码器目前只支持
&
>
,但是添加对更多HTML实体的支持非常容易

首先,这里是编码器:

var Encoder = {
    encode: (function() {
      var translate_re = /&(nbsp|amp|quot|lt|gt);/g,
            translate = {
                'nbsp': String.fromCharCode(160), 
                'amp' : '&', 
                'quot': '"',
                'lt'  : '<', 
                'gt'  : '>'
            },
            translator = function($0, $1) { 
                return translate[$1]; 
            };

        return function(s) {
            if(typeof s === 'string')
                return s.replace(translate_re, translator);
            else
                return s;
        };
    })(),
    decode: (function() {
        var reg_str = '(<|>|"|&|' + String.fromCharCode(160) + ')';
        var translate_re = new RegExp(reg_str, 'g');

        var translate = {
            '&' : '&amp', 
            '"': '&quot',
            '<'  : '&lt', 
            '>'  : '&gt'
        };

        translate[String.fromCharCode(160)] = '&nbsp;';

        var translator = function($0, $1) { 
                return translate[$1]; 
        };

        return function(s) {
            if(typeof s === 'string')
                return s.replace(translate_re, translator);
            else
                return s;
        };
    })()
};
使用HTML实体的

解码HTML实体后:
更新regex以更改带有负前瞻性的符号和符号,以避免更改HTML实体

&(?!(#[0-9]{2,4}|[A-z]{2,6});)

两件事:1.你想用
&
替换
&
?和2.你应该接受一些答案。在大多数情况下,你已经得到了一个解决问题的答案。但我怀疑你更大的问题是你接收到的是不正确的输入。你从哪里获得的数据只是部分HTML编码的?当然,数据应该是编码或未编码。我建议与提供输入的任何人进行认真的交谈。可能使用cluebat:-)这将无法逃脱像C&a;这样的
存储,但使用简单的regexp可能很难解决这一问题。您可能也希望避免数字字符引用
s/&(?!\w+;|#d+|#x[\da-f]+)/&;/gi;
也许先以某种方式转义有效的符号,然后替换无效的符号会更容易。例如:
s/&(amp|nbsp)/输入一些难以匹配的文本/g;
感谢Qtax的帮助。您能解释一下您在正则表达式中使用的!、#、;吗?或者请转发一些链接以在正则表达式中使用此类选项。
var Encoder = {
    encode: (function() {
      var translate_re = /&(nbsp|amp|quot|lt|gt);/g,
            translate = {
                'nbsp': String.fromCharCode(160), 
                'amp' : '&', 
                'quot': '"',
                'lt'  : '<', 
                'gt'  : '>'
            },
            translator = function($0, $1) { 
                return translate[$1]; 
            };

        return function(s) {
            if(typeof s === 'string')
                return s.replace(translate_re, translator);
            else
                return s;
        };
    })(),
    decode: (function() {
        var reg_str = '(<|>|"|&|' + String.fromCharCode(160) + ')';
        var translate_re = new RegExp(reg_str, 'g');

        var translate = {
            '&' : '&amp', 
            '"': '&quot',
            '<'  : '&lt', 
            '>'  : '&gt'
        };

        translate[String.fromCharCode(160)] = '&nbsp;';

        var translator = function($0, $1) { 
                return translate[$1]; 
        };

        return function(s) {
            if(typeof s === 'string')
                return s.replace(translate_re, translator);
            else
                return s;
        };
    })()
};
&(?!(#[0-9]{2,4}|[A-z]{2,6});)