PHP - 如何替换url的特殊字符

时间:2015-06-23 08:59:48

标签: php

我正在尝试转换特殊字符(例如+/&%),我会将它们用于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,它会转换一些我不希望转换的其他字符。

6 个答案:

答案 0 :(得分:3)

不要使用循环。

使用str_replace

str_replace($entities, $replacements, $string);

或者更好地使用这个本机PHP函数rawurlencode

答案 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中的元素替换。 在解码期间会进行反向替换。