заменяет несколько символов только внутри тега bbcode и не влияет на любой другой текст, находящийся за пределами bbcode

Итак, у меня есть функция, которую я создал, которая заменяет специальные символы внутри строки. Основная цель состояла в том, чтобы заменить те специальные символы, которые были внутри тега BBCode ([code=any]мой код, который я хочу показать[/code]), но в то время это не имело особого значения, заменял ли он остальные строки вне тега BBcode. Но теперь у меня проблемы с заменой тегов HTML, которые находятся за пределами тега BBcode. Поэтому я пытался придумать решение для этого, но пока не повезло.

Цель состоит в том, чтобы заменить специальные символы, которые находятся внутри:

[code=any]some code inside of here[/code]

Также следует упомянуть, что когда я говорю code=any значение, это может быть что угодно. Это может быть HTML,CSS,PHP,JS [a-z-A-Z-0-9].

так больше похоже

[code=[a-z-A-Z-0-9]<h1>some html insode of the bbcode to be replace</h1>[/code]

Моя текущая функция проста. Требуется просто базовое регулярное выражение:

replaceSpecial : function(str) {

str = str.replace(/&/g, "&amp;");
str = str.replace(/>/g, "&gt;");
str = str.replace(/</g, "&lt;");
str = str.replace(/"/g, "&quot;");
str = str.replace(/'/g, "&#039;");

return str;
}

Но как мне переписать это так, чтобы он заменял только текст, который находится внутри: [code=any]некоторый код внутри здесь[/code] и все. Если у кого-то есть решение для этого, это было бы здорово.

Спасибо за ваше время, Джон В.


person Jon W    schedule 17.03.2019    source источник
comment
вы можете использовать группы захвата regex101.com/r/KGCWmq/1 см. мой обновленный вопрос   -  person Herman Andres Figueroa    schedule 17.03.2019
comment
Пожалуйста, рассмотрите возможность пометить мой ответ как принятый, поскольку он сработал для вас, и проголосовать, если он оказался полезным для вас.   -  person Wiktor Stribiżew    schedule 19.03.2019


Ответы (2)


Хотите ли вы извлечь текст внутри штрих-кода и применить это регулярное выражение, вы можете использовать exec, чтобы просто применить замену к тому, что находится внутри кода, можно использовать Группы захвата и обратные ссылки, см. дополнительную ссылку https://www.regular-expressions.info/refcapture.html

в этом случае получите только текст внутри bbcode и обработайте его

let code = "[code=any]<h1>hello and bye</h1>e[/code]";
//extract only texto inside bbcode
let match = /\[code\=any\](.+)\[\/code\]/g.exec(code)[1];
//get <h1>hello</h1>e
let replacement = myObj.replaceSpecial(match);

введите здесь описание изображения

см. https://regex101.com/r/KGCWmq/1

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

var myObj = {
    replaceSpecial : function(str) {
        str = str.replace(/&/g, "&amp;");
        str = str.replace(/>/g, "&gt;");
        str = str.replace(/</g, "&lt;");
        str = str.replace(/"/g, "&quot;");
        str = str.replace(/'/g, "&#039;");
        return str;
    }
};
let code = "[code=any]<h1>hello and bye</h1>e[/code]";
let match = /\[code\=any\](.+)\[\/code\]/g.exec(code)[1];
let replacement = myObj.replaceSpecial(match);
let string = code.replace(/\[code\=any\](.+)\[\/code\]/,"[code=any]"+replacement+"[/code]")

ОБНОВЛЕНО

Согласно ответу Виктора Стрибижева, регулярное выражение можно проверить, чтобы bbcode был любым

myObj = {
  replaceSpecial : function(str) {
     return str.replace(/&/g, "&amp;")
               .replace(/>/g, "&gt;")
               .replace(/</g, "&lt;")
               .replace(/"/g, "&quot;")
               .replace(/'/g, "&#039;");
  }
}

var s = '[code="HTML"]<h1>Hello</h1>[/code]';
var regex = /(\[code=[^\]]*])([^]*?)(\[\/code])/gi;
console.log( s.replace(regex, function($0, $group_match1, $group_match2, $group_match3) { return $group_match1 + myObj.replaceSpecial($group_match2) + $group_match3; }) );

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

person Herman Andres Figueroa    schedule 17.03.2019
comment
Что ж, было бы неплохо, если бы это была одна целая функция, и она просто переворачивала все значение после того, как заменяла его. Я пытаюсь понять, как заставить эту работу работать, так что это всего лишь одна целая функция. Я верю, что это довольно близко, хотя. - person Jon W; 17.03.2019
comment
Хотя это именно то, что я пытался сделать. - person Jon W; 17.03.2019
comment
Поправьте меня, если я ошибаюсь, но это будет работать только в том случае, если BBCode точно [code=any]какой-то текст[/code], верно? В таком случае это не сработает. Код может быть HTML, CSS, PHP, JS, так что, когда я говорю «любой», я имею в виду любое слово. - person Jon W; 17.03.2019
comment
Вы можете использовать выражение, упомянутое в следующем ответе, и оно разделено на три группы /([code=[^]]*])([^]*?)([\/code])/gi - person Herman Andres Figueroa; 17.03.2019
comment
Я обновил свой ответ, основываясь на оптимизации следующего ответа. - person Herman Andres Figueroa; 17.03.2019
comment
@WiktorStribiżew Я извинился, но в то время я писал похожее решение, поэтому я упомянул вас в ответе. - person Herman Andres Figueroa; 20.03.2019

Если у вас нет вложенных тегов code, вы можете использовать

/(\[code=[^\]]*])([^]*?)(\[\/code])/gi

Или, если вы обнаружите проблемы с производительностью этого регулярного выражения, замените его эквивалентом, написанным в соответствии с unroll-the-loop принцип:

/(\[code=[^\]]*])([^[]*(?:\[(?!\/code])[^[]*)*)(\[\/code])/gi

См. демонстрацию регулярного выражениядемонстрационная версия оптимизированного регулярного выражения).

Подробнее

  • (\[code=[^\]]*]) — Группа 1: [code=, а затем любые символы 0+, кроме ], а затем ]
  • ([^]*?) — Группа 2: любые 0 или более символов, как можно меньше (*? — это *нежадный квантификатор)
  • (\[\/code]) - Группа 3: [/code] подстрока.

Используйте его внутри String#replace следующим образом:

function replaceSpecial(str) {
  return str.replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
}

var s = '[code="JS"]<p align="center">D&elete the "Go" \'icon\'.</h1>[/code]';
var regex = /(\[code=[^\]]*])([^]*?)(\[\/code])/gi;
console.log( s.replace(regex, function($0, $1, $2, $3) { return $1 + replaceSpecial($2) + $3; }) );

Примечание: если вам когда-нибудь понадобится исключить [code= между [code= и [/code], вам нужно будет изменить регулярное выражение на

/(\[code=[^\]]*])([^[]*(?:\[(?!\/?code[\]=])[^[]*)*)(\[\/code])/gi

См. эту демонстрацию регулярного выражения.

person Wiktor Stribiżew    schedule 17.03.2019