2010-09-03 68 views
1

好的,所以我目前正在使用JS的escape()和一些字符串替換來模仿PHP urlencode()函數的簡單方式。我純粹看着鍵盤字符,所以沒有特殊的ASCII或Unicode字符。我遇到的問題是特定字符*,+和/在RegExp中具有特殊含義,並且由於JavaScript String Object方法使用RegExp參數,因此我無法完全複製PHP的urlencode()。因此,如何設法使用JS執行字符串內的這些字符替換?Javascript替換字符中的字符*,+和//

背景資料:用urlencode)
逃逸()的差異(:
@:未轉換,應該是%40
&:考慮一個HTML實體,從而轉義爲%26安培%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}條件
/是基本的正則表達式標記字符

謝謝您的時間。

+1

爲什麼不使用JavaScript內置的encodeURIComponent()函數? http://www.w3schools.com/jsref/jsref_encodeuricomponent.asp – 2010-09-03 02:18:56

回答

0

你總是可以使用good 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 2010-09-03 02:22:49

+0

...和obelix) – 2016-08-01 20:54:31

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。

霍先生,謝謝你的繞行解決方案。我會檢查一下,看看它是否有效(它應該)。首先,字符串數組的訪問將會是非常冗長的代碼添加,尤其是在處理需要替換的三個額外字符時(我知道,它可能只是一個if /否則if/else if,但這仍然是相當多的代碼)。 Oui,et biença足以證明法國文化。

關於William的迴應,如果您做了一些研究,您會注意到encodeURIComponent()實際上並未編碼大量由PHP的urlencode()編碼的字符。整個問題的目標是在JS中構建urlencode()的簡單副本。

所以謝謝大家的迴應,非常感謝。

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

顯然其他人可能更改代碼以不同的方式,使其工作,但對我來說,省去了避免替換的百分比符號串擾更方便。

再次感謝大家。