我正在尝试转换特殊字符(例如+
,/
,&
,%
),我会将它们用于GET请求。我为此构建了一个函数。
function convert_text($text) {
$t = $text;
$specChars = array(
' ' => '%20', '!' => '%21', '"' => '%22',
'#' => '%23', '$' => '%24', '%' => '%25',
'&' => '%26', '\'' => '%27', '(' => '%28',
')' => '%29', '*' => '%2A', '+' => '%2B',
',' => '%2C', '-' => '%2D', '.' => '%2E',
'/' => '%2F', ':' => '%3A', ';' => '%3B',
'<' => '%3C', '=' => '%3D', '>' => '%3E',
'?' => '%3F', '@' => '%40', '[' => '%5B',
'\\' => '%5C', ']' => '%5D', '^' => '%5E',
'_' => '%5F', '`' => '%60', '{' => '%7B',
'|' => '%7C', '}' => '%7D', '~' => '%7E',
);
foreach ($specChars as $k => $v) {
$t = str_replace($k, $v, $t);
}
return $t;
}
当我使用some text
作为函数的输入时,我应该得到some%20text
。但是,因为我在foreach循环中执行此替换,它首先将'space'替换为%20
,然后在第二步中将%
字符替换为%25
。最终我得到了some%2520text
。
有没有其他方法或内置函数来进行替换?
rawurlencode取代了所有
$t = str_replace(array_keys($specChars), array_values($specChars), $text);
我使用str_replace而没有循环,建议SpongePablo。
它给出了我不想要的相同结果。另一方面,如果我使用rawurlencode
,它会转换一些我不希望转换的其他字符。
答案 0 :(得分:3)
答案 1 :(得分:2)
您最好不要使用PHP内置功能来执行此操作:rawurlencode?
答案 2 :(得分:1)
在标准PHP库中已经有了这个功能:rawurlencode
。
答案 3 :(得分:1)
function convert_text($text) {
$t = $text;
$specChars = array(
'!' => '%21', '"' => '%22',
'#' => '%23', '$' => '%24', '%' => '%25',
'&' => '%26', '\'' => '%27', '(' => '%28',
')' => '%29', '*' => '%2A', '+' => '%2B',
',' => '%2C', '-' => '%2D', '.' => '%2E',
'/' => '%2F', ':' => '%3A', ';' => '%3B',
'<' => '%3C', '=' => '%3D', '>' => '%3E',
'?' => '%3F', '@' => '%40', '[' => '%5B',
'\\' => '%5C', ']' => '%5D', '^' => '%5E',
'_' => '%5F', '`' => '%60', '{' => '%7B',
'|' => '%7C', '}' => '%7D', '~' => '%7E',
',' => '%E2%80%9A', ' ' => '%20'
);
foreach ($specChars as $k => $v) {
$t = str_replace($k, $v, $t);
}
return $t;
}
将键和值放在最后,这样循环的最后一次迭代将用于空格
除此之外你可以使用
urlencode - 内置于php的功能
答案 4 :(得分:0)
您可以使用rawurlencode($url)
内置功能。</ p>
<?php
$url='http://fb.com';
echo rawurlencode($url);
输出:
的http%3A%2F%2Ffb.com
答案 5 :(得分:-1)
由于所有替换项中都带有百分比(%)字符,因此必须首先用与其等效的%25替换所有出现的%。之后,您应该替换其他字符,例如空格等。 当您尝试将编码的url转换回其原始状态时,%字符应该是您转换回的最后一个字符。 以相反的顺序转换回数组。 使用array_reverse()函数可以反转$ specChars元素的顺序。 换句话说,您必须使用两个单独的函数来对URL进行编码和解码。
以下是我自己编写的用于完成工作的功能。
$arrayChrs = array('%',' ','!');
$arrayChrs = array('%25', '%20','%21');
function encodeData($subject)
{ //enode data
global $arrayCodes;
global $arrayChrs;
if (!is_null($arrayChrs) && !is_null($arrayCodes)) {
$arCnt1 = count($arrayChrs);
$arCnt2 = count($arrayCodes);
if ($arCnt2 == $arCnt1) {
for ($x = 0; $x <= ($arCnt2 - 1); $x++) {
$code1 = $arrayCodes[$x];
$char1 = $arrayChrs[$x];
$code_encoded = utf8_encode($code1);
$char_encoded = utf8_encode($char1);
$subject = str_replace($char_encoded, $code_encoded, $subject);
}
}
}
return $subject;
}
//[end function]
function decodeData($subject)
{ //decode data
global $arrayCodes;
global $arrayChrs;
$outputStr = $subject;
if (!is_null($arrayChrs) && !is_null($arrayCodes)) {
$arCnt1 = count($arrayChrs);
$arCnt2 = count($arrayCodes);
if ($arCnt2 >= 1 and $arCnt2 == $arCnt1) {
if ($arCnt2 >= 1) {
for ($x = ($arCnt2-1); $x >=0; $x--) {
$code1 = $arrayCodes[$x];
$char1 = $arrayChrs[$x];
$code_encoded = utf8_encode($code1);
$char_encoded = utf8_encode($char1);
$outputStr = str_replace($code_encoded, $char_encoded, $outputStr);
}
}
}
}
return $outputStr;
}
//[end function ]
请注意,一个for循环使用$ x ++对元素进行正向计数,而另一个使用$ x--对元素进行反向计数。
在编码过程中,$ arrayChrs中的元素被$ arrayCodes中的元素替换。 在解码期间会进行反向替换。