2010-09-03 2 views
1

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

Справочная информация:
побег() расхождения с 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 тега

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

+1

Почему бы не использовать встроенную функцию encodeURIComponent() JavaScript? http://www.w3schools.com/jsref/jsref_encodeuricomponent.asp –

ответ

0

Вы всегда можете использовать хороший доступ к массиву 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); 
    } 
}​ 
+0

Он содержит звездочку, а не астерикс. – Robusto

+0

... и обеликс) –

4

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

s = s.replace(/\*/g, 'star'); 
3

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

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

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

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

Господин Хоуп, благодарю вас за обходное решение. Я проверю это и посмотрю, работает ли он (это должно).

Mahir (محير?). Во-первых, доступ к строковым массивам будет очень длинным дополнением кода, особенно при работе с тремя дополнительными символами, которые необходимо заменить (да, я знаю, это может быть просто if/else if/else if, но это все еще довольно немного кода). Oui, et bien ça suffit de dire qu'il est mon caractère favorit de la littérature Française.

Что касается ответа Уильяма, если вы сделаете небольшое исследование, вы заметите, что encodeURIComponent() на самом деле не кодирует множество символов, которые закодированы с помощью urlencode() PHP. Целью всего этого вопроса было создание простой копии urlencode() в JS.

Так что спасибо всем за отзыв, это очень ценится.

--addendum--
код г Хоуп работает, с одной подстройкой:

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]; }); 
} 

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

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

Смежные вопросы