Замените строчные буквы в href на прописные

У меня есть веб-страница, которая генерирует ссылки для ключевых слов. Ссылки генерируются на веб-странице следующим образом:

https://www.example.com/?keywords=energy
https://www.example.com/?keywords=wind%20power

Я хотел бы изменить его так, чтобы первый символ после =%20, если применимо) был в верхнем регистре:

https://www.example.com/?keywords=Energy
https://www.example.com/?keywords=Wind%20Power

В настоящее время я меняю их на верхний регистр для каждого ключевого слова:

$(document).ready(function(){
    $('a').each(function(){
        this.href = this.href.replace('energy', 'Energy');
    });

    $('a').each(function(){
        this.href = this.href.replace('wind%20power', 'Wind%20Power');
    });
});

Есть ли способ сделать это, но с любой строкой? Я пробовал несколько регулярных выражений, но не могу найти регулярное выражение для замены первого символа после знака равенства его эквивалентом в верхнем регистре с использованием javascript. Например, я попробовал это (https://regex101.com/r/ybQbaE/1/), а затем попытался сбросить это в свой скрипт на странице:

`$(document).ready(function(){
    $('a').each(function(){
        this.href = this.href.replace(\=.,\U$0);
    });
});`

Конечно, это не сработало, потому что это для PHP, но когда я нажимаю на ECMAscript Flavor в тестере регулярных выражений, он просто заменяет знак равенства и первый символ после него на \U$0.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
813
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

$('a').each(function(){
    this.href = this.href.replace(
        /=(.+)/g,
        (_, keywords) => '=' + keywords.replace(
            /([a-z])([a-z]*)/gi,
            (_, initial, rest) => initial.toUpperCase() + rest.toLowerCase()
        )
    );
});

$('a').each(function(){
    this.href = this.href.replace(
        /=(.+)/g,
        (_, keywords) => '=' + keywords.replace(
            /([a-z])([a-z]*)/gi,
            (_, initial, rest) => initial.toUpperCase() + rest.toLowerCase()
        )
    );
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href = "https://www.example.com/?keywords=energy">a</a>
<a href = "https://www.example.com/?keywords=wind%20power">a</a>

Как насчет использования технологии после 2010 года?

NVRM 19.12.2020 04:05

Что ты имеешь в виду? .replace работает просто отлично, а неявный возврат стрелочных функций (функция ES2015) действительно хорош. Я думаю, вы могли бы превратить '=' + keywords.replace в литерал шаблона, но это было бы слишком сложно читать, ИМО

CertainPerformance 19.12.2020 04:13

ну, я оставил ответ об использовании встроенного парсера URL(). Может и не лучшим образом идк, но по крайней мере читабельно и даже запоминаемо (Как я там и сделал, головой).

NVRM 19.12.2020 04:45

Если вы хотите сопоставить = или% 20, вам просто нужно изменить регулярное выражение, чтобы включить% 20 ​​в качестве опции, убедитесь, что у вас установлен глобальный флаг, а затем передайте функцию вашей функции замены, чтобы прописные части были строки, которая соответствует.

let url = "https://www.example.com/?keywords=wind%20power%20earth%20fire";

let regex = /(?<=\=|%20)(.)/g;
url = url.replace(regex, function (match, capture) {
    return capture.toUpperCase();
})

console.info(url)

Не нужно изобретать, используйте конструктор URL()!

let url = new URL("https://www.example.com/?keywords=wind%20power%20earth%20fire");

let params = url.searchParams.get('keywords')
console.info(params)

params.split(" ").forEach( (e) => {
    console.info(
      e[0].toUpperCase() + e.substring(1)
    )
  }
)

Эй, это довольно круто, мне нравится интерфейс URL. Обратите внимание, что OP необходимо изменить href, а не просто регистрировать измененные слова.

CertainPerformance 19.12.2020 04:47

Конечно, нужна конкатенация, должно быть легко.

NVRM 19.12.2020 04:48

Обычно регулярное выражение должно быть последним шагом, когда не осталось конкретных кодировщиков/декодеров, которые могли бы помочь. (например, в этом случае decodeURIComponent или конструктор URL)

document.querySelectorAll('a').forEach(a=>{
    var url = new URL(a.href);
    var keywords = url.searchParams.get('keywords')
    if ( keywords ){
      //Capitalize thanks to: https://stackoverflow.com/a/7592235/1683017
      keywords = keywords.replace(/(?:^|\s|["'([{])+\S/g, m => m.toUpperCase())
      url.searchParams.set('keywords', keywords )
      a.href = url.href;
    }
})
Ответ принят как подходящий

Если это ваши единственные случаи, вы можете решить их с помощью простого лайнера:

url = "https://www.example.com/?keywords=wind%20power%20earth%20fire"
url.replace(/(=\w)|(\s\w)|(%20\w)/g,val=>val.toUpperCase())

Для получения дополнительной информации о шаблонах Regexp посетите это. Чтобы узнать больше о функции замены javascript, посетите документы Replace MSDN

Это работает как шарм. Спасибо! И за ссылки тоже спасибо. Я определенно многое узнаю о регулярных выражениях. Очень признателен.

benzio 19.12.2020 18:43

Я думаю, что это проще концептуально (для меня во всяком случае):

url.replace(/=.*/, k => k.replace(/[a-z]+/g, s => s.toUpperCase()))

Это просто заменяет все после знака «=» на верхний регистр. Я полагаю, что оператор хотел сделать заглавной только первую букву после знака «=», а также первую букву после каждого пробела.

Mario Figueiredo 22.12.2020 03:46

Другие вопросы по теме