Как я могу заменять %20 и + из-за - в url?

Мне хотелось бы мочь получать или обнаруживать все место типа %20 и + в url, и заменять их из-за - используя язык сценариев JavaScript.

У меня есть этот regex /[\s\%20\+]/g но я не знаю, действительно функционирует ли оно, не знаю много о регулярных выражениях xD.

Пример с +:

http://miurl.com/mi+url+web

И я хочу, чтобы это осталось так:

http://miurl.com/mi-url-web

Пример с %20:

http://miurl.com/mi%20url%20web

И я хочу, что, который я схватил;

http://miurl.com/mi-url-web

Пример с + и %20:

http://miurl.com/mi+url%20web

И я хочу, чтобы это осталось так:

http://miurl.com/mi-url-web

Здесь я добавляю мои urls с hash:

http://miurl.com/#!mi+url%20web

И я манипулирую ими с событием hashchage и обычно костлявая, перезагружая страницу полностью вручную, только, что, исправив urls с - меня создает бесконечная переадресация. Верь в код, относящийся к тому, которого они показали мне здесь, но делая это с window.location.hash он делает мне бесконечную переадресацию.

12
задан 20.02.2017, 06:27
4 ответа

Язык сценариев JavaScript

Восток - c¦digo, чтобы заменять hash (фрагмент / приклеивает этикетку) URI. Смоги идти в <head> HTML для того, чтобы это было первое, что работает.

//Reemplazar al cargar la página
if (location.hash)
    location.replace(location.hash.replace(/\+|%20/g, "-"));

//Asignar evento cuando se cambie el hash
window.addEventListener("hashchange", function(event){
    if (location.hash)
        location.replace(location.hash.replace(/\+|%20/g, "-"));

    //Descomentar para mostrar en consola cuando se dispara
    //console.debug("Se disparó el evento hashchange: ", event.oldURL, "-->", event.newURL);
});

могут видеть, что estÃ: заменяя

  1. Едва загружается pÃ: gina.
  2. , Если, в течение navegaci¦n, пользователь меняет фрагмент (вручную или из-за c¦digo).


Descripci¦n regex:


Demo regex: https://regex101.com/r/R35zAs/1
Demo рукописного шрифта: http://mariano.uphero.com/50400/#demo+del%20script


Других выборов, чтобы заменять место:

  • /[+ ]|%20/g - Чтобы заменять también в буквальное место.
  • /(?:[+ ]|%20)+/g - Чтобы превращать в múltiples типа места последующие в единственный gui¦n.


location.replace("#hash") vs. location.hash = "#hash"

Прямой способ менять hash - с:

location.hash = location.hash.replace(/\+|%20/g, "-");

Однако, это способствует тому, чтобы он присоединился в биографии браузера. И если мы заменяем #a+b #a-b, перейдя с одного сайта на другой к atrÃ: s ( back ), c¦digo volver¦ - чтобы в заменять #a+b, способствуя тому, чтобы он вернулся automÃ: ticamente в última URI. А именно, не permitir¦, - чтобы возвращаться к pÃ: gina предыдущий. По этой причине, мы используем location.replace () , которые заменяют настоящий ввод биографии (не производя нового ввода).
* Такой, который комментарий aldanux , podr¦, - чтобы манипулировать с history.replaceState () , захватывая в onpopstate .



.htaccess

, Если ademÃ: s хотят быть заменены символы маршрута ( pathname ) с .htaccess, c¦digo ser¦ - в:

RewriteEngine On

#Reemplazar por la ruta de tu página!!!
RewriteBase /ruta

#Reescribir si tiene 2 o más "%20" o "+"
RewriteRule "^([^+ ]*)[+ ]([^+ ]*[+ ].*?)/*$" $1-$2 [N]
#Redireccionar si tiene 1 "%20" o "+"
RewriteRule "^([^+ ]*)[+ ](.*)" $1-$2 [R,L]


Descripci¦n

  • En .htaccess, не получают %20, потому что Апачи интерпретирует их прямо местом. Поэтому, заменяется [+ ] (один + или место).
  • Первое правило заменяет, когда есть mÃ: s характера, используя flag [N], который способствует тому, чтобы вновь работали все правила (мы производим loop).

    • ^([^+ ]*)[+ ] - Встречается с начала с 1. любое количество символов, которые не ни + ни место (захваченный в $1), и 2. с характером [+ ].
    • ([^+ ]*[+ ].*) - Захватывает в $2 1. mÃ: s символы, которые не ни + ни место, 2. искавший характер, и 3. вся оставшаяся часть до конца.
    • /*$ - Встречается с бруском в конце URI, чтобы оставлять ее вне группы, и не включать ее в перенаписание (если нет, estar¦-an накапливая бруски в конце концов из-за каждого замененного места).
    • заменяет $1-$2 - Все то, что estÃ: перед первым + или местом, одним - и все то, что estÃ: después.
  • Второе правило - то же самое, кроме того, что s¦lo он ищет совпадать с único + или местом (может быть 1 s¦lo, потому что если llegà до acÃ: дело в том, что не coincidià с предыдущим правилом). В этом случае, вместо того, чтобы повторно писать, мы находимся redireccionando с [R], asà - мы меняем унифицированный указатель ресурса в ту, кто соглашается.


Demo
http://mariano.uphero.com/50400/b/path+con%20espacios#y+hash%20tambien


Другая альтернатива . Вместо того, чтобы основываться чисто и исключительно на .htaccess, podr¦-хозяевах повторно писать любой direcci¦n, который имел бы один [+ ] по отношению к рукописному шрифту PHP с

RewriteRule "[+ ]" redireccionar.php [L]

, И браться за то, чтобы заменять все символы, желаемые внутри рукописного шрифта с preg_replace () , производя redirecci¦n с этого рукописного шрифта. Эта форма quizÃ: s он mÃ: s простая, если он осложняется, понимать предыдущий soluci¦n, или может служить для того, чтобы поддержать log сделанного перенаправления.

7
ответ дан 24.11.2019, 10:58
  • 1
    Очень хорошо объясненный, спасибо. – Rimuru Tempest 20.02.2017, 09:55
  • 2
    Не, если это помещается в сомнении в OP, но в tú pá gina примера я вижу, что оно не функционирует, биографию, а именно он не позволяет тебе делать back, так как он берет всегда фильтр, quizá s с pushState () или replaceState () решает. равно +1 из-за твоего pá gina примера :) – Black Sheep 20.02.2017, 13:57
  • 3
    @aldanux Точный (он не состоит в том, чтобы оно не функционировало, но он идет к atrá s и он возвращается automá ticamente). Ло vi, но я не захотел осложнить má s có я говорю, так как было слишком много комментариев. И sí resolverí в как comentá в. – Mariano 20.02.2017, 14:02
  • 4
    @aldanux В конце концов resolví с location.replace () , которые не осложняют có я говорю и он заменяет настоящий вход биографии. – Mariano 20.02.2017, 18:54
  • 5
    Он собирался принимать этот ответ, но я понял, что он не состоял в том, что он спрашивал... :) – Black Sheep 20.02.2017, 19:04

Я думаю, что с этим простым funci¦n ты можешь заменять, что ты ищешь

function replaceUrl(url){
  return url.replace(/%20|\+/g, "-");;
}

console.log(replaceUrl('http://miurl.com/mi+url+web'))
console.log(replaceUrl('http://miurl.com/mi%20url%20web'))
console.log(replaceUrl('http://miurl.com/mi+url%20web'))
3
ответ дан 24.11.2019, 10:58
  • 1
    Оно функционирует совершенно, но я появляется другая проблема, что забыло мне индексировать в примере, за чем оно последует, состоит в том, что я имею urls манипулируемые из-за hash. В этом моменте я добавлю пример, как у меня есть мои urls – Rimuru Tempest 20.02.2017, 05:56

Приуменьшенный adaptaci¦n c¦digo в versi¦n 1 из ответ из Jorious

// http://miurl.com/mi+url+web
// http://miurl.com/mi%20url%20web
// http://miurl.com/mi+url%20web

function replaceUrl(url){
  var fUrl = url.replace(/%20|\+/g, "-");
  return fUrl;
}

console.log(replaceUrl('http://miurl.com/mi+url+web'))
console.log(replaceUrl('http://miurl.com/mi%20url%20web'))
console.log(replaceUrl('http://miurl.com/mi+url%20web'))

Explicaci¦n

  • Регулярный expresi¦n выражает между /, после которой себе показывает модификатор búsqueda глобально g.
  • %20 - одна из последовательности символов, эта размещается прямой формы
  • \+ убежала характер +, который соответствует другой последовательности символов из-за того, что - специальный характер
  • | есться colcado между двумя часами ateriores выражения, чтобы показывать одну, другую Ã оба (оператор disyunci¦n l¦gica , ó (OR) boleano)
2
ответ дан 24.11.2019, 10:58

CreÃ, что в конце концов я это решил, если я в чем-то ошибаюсь, надеялся, что он помогает мне исправлять это, они agradeceré много, это мой код:

String.prototype.regIndexOf = function(regex, startpos) {
  var indexOf = this.substring(startpos || 0).search(regex);
  return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
}

function space(){
  var hash;
  if (location.hash.regIndexOf(/%20|\+/g) !== -1){
    hash = location.hash.replace(/%20|\+/g, '-');
  }
  location.hash = hash ? hash : location.hash;
}
2
ответ дан 24.11.2019, 10:58
  • 1
    В моем opinió n есть слишком много có я говорю избыточно. Все это может писать в lí nea без того, чтобы между в бесконечной переадресации - > location.hash = location.hash.replace(/\+|%20/g, "-"); – Mariano 20.02.2017, 06:40
  • 2
    Уже я это попробовал así но он вызывает бесконечную переадресацию, итак, я использую событие hashchange – Rimuru Tempest 20.02.2017, 06:51
  • 3
    И только этот код я функционирует в perfecció n. – Rimuru Tempest 20.02.2017, 06:51
  • 4
    Событие hashchange só оно взрывается, когда изменяется hash, и не взрывается, когда ему назначается та же стоимость . Невозможно, что esté входя в redirecció n бесконечная. Есть что-то из твоего có я говорю, что мы не видим. ¿ redirecció n он производится в JavaScript или в .htaccess? – Mariano 20.02.2017, 06:54
  • 5
    Я оставляю тебе пример, который он показывает, что не производится бесконечная переадресация (podé s пытаться вручную или из-за консоли) - > mariano.freevar.com/50400 – Mariano 20.02.2017, 07:29

Теги

Похожие вопросы