Помощь с регулярным выражением

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Дана тестовая строка:

 <div class="comment-quoter">Comment by <strong>Tom</strong>
  

Я хочу изменить его на

 [quote=Tom]
  

Я дошел до этого, но он не находит совпадений:

 PostTxt = PostTxt.replace(new RegExp("<div class="comment-quoter">Comment by <strong>{(. ),}</strong>", "g"), '[quote=$1]')
  

Комментарии:

1. Не уверен, рекомендуется ли вообще делать это таким образом; это абсолютно негибко. Представьте, произошли ли некоторые изменения разметки из-за какого-либо другого кода javascript, или дополнительные пробелы привели бы к удалению регулярного выражения и т.д.

2. @Davin, это часть системы комментариев, это сложно, потому что люди вводят [quote]rgrg[/quote] , отправляют его, оно анализируется как HTML, затем, когда я редактирую комментарии, мне нужно изменить его, чтобы отобразить в исходном формате.

Ответ №1:

Попробуйте:

 PostTxt = PostTxt.replace(new RegExp("<div class="comment-quoter">Comment by <strong>(. )</strong>", "g"), '[quote=$1]')
  

Круглые скобки обозначают $1 группу захвата, поэтому фигурные скобки и запятая будут соответствовать литералам и не нужны.

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

(w )

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

Комментарии:

1. Это тоже не соответствует, извините

2. Помните, что регулярные выражения являются жадными. Ваш съедает слишком много и завершится неудачей, если PostTxt будет содержать более одной цитаты .

3. @Tom Gullen: Отличная работа! Я начал сомневаться в своем здравомыслии! 😀

4. @Jason спасибо, система гарантирует, что вложенных кавычек не будет.

5. @Jason McCreary: Я добавил обновление, чтобы обозначить этот факт, приветствую.

Ответ №2:

Если вы хотите сделать это без накладных расходов на явное создание нового объекта регулярного выражения (поскольку вы все равно его не сохраняете), просто сделайте это:

 PostTxt = PostTxt.replace(/<div class="comment-quoter">Comment by <strong>(. )</strong>/g, '[quote=$1]');
  

Ответ №3:

 PostTxt = PostTxt.replace(/<div class="comment-quoter">Comment by <strong>(. ?)</strong>/g, '[quote=$1]')