Javascript замена символов *, + и / внутри строки - PullRequest
2 голосов
/ 03 сентября 2010

Хорошо, так что в настоящее время я работаю над упрощенным способом имитации функции PHP urlencode () с помощью escape () JS и некоторой замены строки.Я просто смотрю на символы клавиатуры, поэтому никаких специальных символов ASCII или Unicode.Проблема, с которой я сталкиваюсь, состоит в том, что определенные символы *, + и / все имеют специальные значения в RegExp, и, поскольку методы объекта String объекта JavaScript используют параметры RegExp, я не могу полностью скопировать PHP-код urlencode ().Таким образом, как можно было бы выполнить замену этих символов в строке, используя JS?

Справочная информация:
escape () расхождения с urlencode ():
@: не преобразовано,должно быть %40
&: считается html-сущностью, поэтому экранируется как% 26amp% 3B, а не %26
*: не преобразовано, должно быть %2A
+: не преобразовано, должно быть %2B
/: не преобразовано, должно быть %2F
<: считается html-сущностью, поэтому экранируется как% 26lt% 3B, а не %3C
>: считается html-сущностью, поэтому экранируется как% 26gt% 3B вместо %3E

Преобразование HTML-сущности так же просто, как

str.replace(/&amp;/g, '%26').replace(/&lt;/g, '%3C').replace(/&gt;/g, '%3E');

и @ можно заменить, поскольку он не является зарезервированным символом RegExp.
* представляет {0} условное
+ представляет {1} условное
/ является базовым символом тега RegExp

Спасибо за ваше время.

Ответы [ 4 ]

6 голосов
/ 03 сентября 2010

Есть ли причина не просто избегать символов *, + и / с обратными слешами в регулярном выражении?

s = s.replace( /\*/g, 'star' );
3 голосов
/ 03 сентября 2010

Для меня цепочка replace не очень элегантна.Я бы попробовал:

var symbols = {
    '@': '%40',
    '&amp;': '%26',
    '*': '%2A',
    '+': '%2B',
    '/': '%2F',
    '&lt;': '%3C',
    '&gt;': '%3E'
};
str = str.replace(/([@*+/]|&(amp|lt|gt);)/g, function (m) { return symbols[m]; });

Удобно, это также позволяет избежать исходной проблемы.

0 голосов
/ 04 сентября 2010

Извините, что я не использую ту же учетную запись, но чтобы ответить на все, здесь идет:

Мистер.Планкетт, экранирование персонажей фактически не работает в этом случае, по любой причине (вероятно, из-за их зарезервированного статуса персонажа).Я забыл упомянуть, что пытался убежать от них xD.

Мистер.Надеюсь, спасибо за обходное решение.Я проверю это и посмотрю, работает ли (это должно)это нужно заменить (да, я знаю, это может быть просто if / else if / else if, но это все еще довольно много кода).Насколько это возможно? Что касается ответа Уильяма, если вы проведете небольшое исследование, вы заметите, что encodeURIComponent () этого не делает.фактически кодирует множество символов, которые закодированы в PHP urlencode ().Цель всего этого вопроса состояла в том, чтобы создать в JS простую копию urlencode ().

Так что спасибо всем за ответы, это очень ценится.* Код мистера Хоупа работает с одним твиком:

function urlencode(str) {
   var symbols = {
      '@': '%40',
      '%26amp%3B: '%26',
      '*': '%2A',
      '+': '%2B',
      '/': '%2F',
      '%26lt%3B': '%3C',
      '%26gt%3B': '%3E'
   };
   return escape(str).replace(/([@*+/]|%26(amp|lt|gt)%3B)/g, function (m) { return symbols[m]; });
}

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

Спасибо всем еще раз.

0 голосов
/ 03 сентября 2010

Вы всегда можете использовать хороший доступ к массиву строк OLE.

var myString = "Hello this is a string. * It contains an asterisk.";

for(var i = 0; i < myString.length; i++)
{
    if(myString[i] == '*')
    {
        alert(i);
    }
}​
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...