为什么我的网址编码不起作用?

时间:2013-01-28 17:27:27

标签: php regex

如果这个问题看起来太便宜,请原谅我。

我有这一行:

preg_match_all($pattern, $_GET['id'], $arr);

在搜索过程中传递带空格的值时,一旦遇到空格,该值就会中断。

例如:

36 2543541284

注意6到2之间的空格。在类似的情况下,只显示36个。

忽略空格后的数字提醒。这给用户“找不到数据”消息。

我尝试使用urlencode添加20%但没有运气。

preg_match_all($pattern, rawurlencode($_GET[id]), $arr);

我也尝试过urlencode,但无济于事。

我可能做错了什么?

function format($matches)
{
    return $matches[1][0].(strlen($matches[2][0])>0?$matches[2][0]:" ").$matches[3][0].(strlen($matches[4][0])>0?"  ".$matches[4][0]:"");
}

// CONSTRUCT A REGULAR EXPRESSION
$pattern
= '/'         // regex delimiter
. '('         // START of a capture group
. '\d{2}'     // exactly two digits
. ')'         // END of capture group
. '('         // START SECOND capture group
. '[ND]?'     // letters "D" OR "N" in any order or number - This is optional
. ')'         // END SECOND capture group
. '('         // START THIRD capture group
. '\d*'       // any number of digits
. ')'         // END THIRD capture group
. '('         // START FOURTH capture group
. 'GG'        // the letters "GG" EXACTLY
. '[\d]*'     // any number of digits
. ')'         // END THIRD capture group
. '?'         // make the LAST capture group OPTIONAL
. '/'         // regex delimiter
;


 preg_match_all($pattern, rawurlencode($_GET[id]), $arr);

// REFORMAT the array
$str = format($arr);

// show what we did to the data
echo '<pre>' . PHP_EOL;
echo '1...5...10...15...20...' . PHP_EOL;
echo $pattern;
echo PHP_EOL;
//Are we getting what we asked for? This is a test. We will comment out all 6 lines if we are happy with output of our REFORMATTING.
echo $str;
echo PHP_EOL;

2 个答案:

答案 0 :(得分:0)

您的正则表达式将不匹配两位数后跟一个空格和更多数字 如果您愿意,可以将[ND]?更改为[\sND]?,但如果字符串不是全部数字,也会允许空格。

如果您需要有关正则表达式的进一步建议,则需要准确指定规则。

答案 1 :(得分:0)

在这种情况下,正则表达式是一种矫枉过正。

来自urlencode manual

  

返回一个字符串,其中除-_.之外的所有非字母数字字符   已被替换为百分比(%)符号后跟两个十六进制数字   和空格编码为加号(+)符号。它的编码方式与之相同   来自WWW表单的发布数据被编码,其方式与中的相同   application / x-www-form-urlencoded媒体类型。这与» RFC 3986编码(请参阅rawurlencode())的不同之处在于,由于历史原因,   空格编码为加号(+)符号

它明确指出,如果您希望将空格编码为%20而不是+,则应使用rawurlencode()

代码示例:

$strings = array(
    '36 2543541284',
    '1234 5678',
    'this is a string'
);
$strings_encoded = array();

foreach($strings as $string)
{
    $strings_encoded[] = rawurlencode($string);
}

var_dump($strings_encoded);

<强>输出:

array(3) {
  [0]=>
  string(15) "36%202543541284"
  [1]=>
  string(11) "1234%205678"
  [2]=>
  string(22) "this%20is%20a%20string"
}