Регулярное выражение для замены и с & - PullRequest
4 голосов
/ 13 мая 2011

У меня есть строка, которая похожа на приведенную ниже.

"This R&M & Exapmle  . It is very big & Complicated &146; example."

Я хочу заменить & на &, но когда я использую $str =~ s/&/&/ig;, которые дают следующий вывод.

"This R&M & Company  . It is very big & CMM Level3 &146; Organization."

И я ожидаю этого.

"This R&M & Company  . It is very big & CMM Level3 &146; Organization."

Пожалуйста, помогите мне, я понятия не имею, как это исправить.

Ответы [ 4 ]

11 голосов
/ 13 мая 2011

Вы можете использовать отрицательное прогнозное утверждение :

$str =~ s/&(?!\w+;)/&/g;
7 голосов
/ 13 мая 2011
use HTML::Entities;
encode_entities decode_entities "This R&M & Exapmle  . It is very big & Complicated &146; example."
# returns: "This R&M & Exapmle  . It is very big & Complicated &146; example."

&146; написано неправильно для ’.Если у вас есть больше ошибок такого рода, отфильтруйте / замените их до кодировки туда и обратно.

0 голосов
/ 25 января 2017

Обновление регулярных выражений для изменения знака амперсанда с отрицательным прогнозом во избежание изменения сущностей HTML

&(?!(#[0-9]{2,4}|[A-z]{2,6});)
0 голосов
/ 16 мая 2016

Я нашел лучший ответ на этот вопрос раньше и принял опубликованный код, установил его в колыбели и сделал его своим, но я нигде не могу найти этот пост.

В любом случае, вотРешение, которое я сделал из него.

Теперь кодировщик в настоящее время поддерживает только  , &, ", < и &gt, но добавить поддержку очень просто.для большего количества 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;
        };
    })()
};

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;
		};
	})()
};

//Here is our string with HTML entities in it
var str = 'Non-Breaking Space: "&nbsp;", Ampersand: "&amp;", Quote: "&quot", Less-Than: "&lt", Greater-Than: "&gt"';

//Lets get our div's
var output_not_endcoded = document.getElementById("output_not_endcoded");
var output_endcoded = document.getElementById("output_endcoded");

//If this div exists, add the string with the HTML entities as is
if(output_not_endcoded)
  output_not_endcoded.innerHTML = str;

//If the other div exists, decode the HTML entities and set it as its contents
if(output_endcoded)
  output_endcoded.innerHTML = Encoder.decode(str);
* {
  font: 13.2px "Courier New", Arial, sans-serif; 
}

body {
  font-size: 100%;
}

.row {
  width:100%;
  height:auto;
  padding: 8px 6px;
}
With HTML Entities:
<div id="output_not_endcoded" class="row" ></div>
<br/>
With HTML Entities Decoded:
<div id="output_endcoded" class="row" ></div>

Действительно легко добавить поддержку других сущностей HTML.

Глядя на кодировщик, вы увидите наш раздел перевода.Одна часть, содержащая регулярное выражение, а другая часть, содержащая наши поля перевода.

Регулярное выражение:

var translate_re = /&(nbsp|amp|quot|lt|gt);/g

Переводы:

translate = {
    'nbsp': String.fromCharCode(160), 
    'amp' : '&', 
    'quot': '"',
    'lt'  : '<', 
    'gt'  : '>'
}

Предположим, вы хотели добавить поддержку длясимвол авторского права "©."Имя сущности для этого символа: &copy. Чтобы добавить поддержку этого символа, просто добавьте его в регулярное выражение и перевод:

Регулярное выражение:

var translate_re = /&(nbsp|amp|quot|lt|gt|copy);/g

Переводы:

translate = {
    'nbsp': String.fromCharCode(160), 
    'amp' : '&', 
    'quot': '"',
    'lt'  : '<', 
    'gt'  : '>',
    'copy': '©',
}

Вам необходимо убедиться, что вы добавили поддержку функций кодирования и декодирования, если вы хотите полную поддержку вперед и назад для кодирования и декодирования.

И это все!Я надеюсь, что это помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...