заменять несколько символов, которые находятся только внутри тега bbcode, и не влиять на любой другой текст, находящийся за пределами кода bbcode - PullRequest
2 голосов
/ 17 марта 2019

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

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

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

Также следует отметить, что когда я говорю код = любое значение, это может быть что угодно.Это может быть HTML, CSS, PHP, JS [azAZ-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] и это все.Если у кого-то есть решение для этого, это было бы здорово.

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

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Если вы хотите извлечь текст внутри штрих-кода и применить это регулярное выражение, вы можете использовать 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);

enter image description here

см. 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]")

ОБНОВЛЕНО

Согласно ответу Wiktor Stribiżew, регулярное выражение может быть проверено так, чтобы 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; }) );

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

1 голос
/ 17 марта 2019

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

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

Или, если вы обнаружите проблемы с этим производством регулярных выражений, замените его на эквивалент, записанный в соответствии с принцип развернутого цикла :

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

См. демонстрационную версию regex оптимизированную демонстрационную версию regex ).

Подробности

  • (\[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

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

...