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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете сопоставить =, а затем использовать другую функцию-заменитель внутри, которая заменяет непрерывные буквенные символы их версией в верхнем регистре:
$('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>Что ты имеешь в виду? .replace работает просто отлично, а неявный возврат стрелочных функций (функция ES2015) действительно хорош. Я думаю, вы могли бы превратить '=' + keywords.replace в литерал шаблона, но это было бы слишком сложно читать, ИМО
ну, я оставил ответ об использовании встроенного парсера URL(). Может и не лучшим образом идк, но по крайней мере читабельно и даже запоминаемо (Как я там и сделал, головой).
Если вы хотите сопоставить = или% 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, а не просто регистрировать измененные слова.
Конечно, нужна конкатенация, должно быть легко.
Обычно регулярное выражение должно быть последним шагом, когда не осталось конкретных кодировщиков/декодеров, которые могли бы помочь. (например, в этом случае 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
Это работает как шарм. Спасибо! И за ссылки тоже спасибо. Я определенно многое узнаю о регулярных выражениях. Очень признателен.
Я думаю, что это проще концептуально (для меня во всяком случае):
url.replace(/=.*/, k => k.replace(/[a-z]+/g, s => s.toUpperCase()))
Это просто заменяет все после знака «=» на верхний регистр. Я полагаю, что оператор хотел сделать заглавной только первую букву после знака «=», а также первую букву после каждого пробела.
Как насчет использования технологии после 2010 года?