Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么不是';我的url编码不能工作吗?_Php_Regex - Fatal编程技术网

Php 为什么不是';我的url编码不能工作吗?

Php 为什么不是';我的url编码不能工作吗?,php,regex,Php,Regex,如果这个问题显得太便宜,请原谅我 我有一句话: preg_match_all($pattern, $_GET['id'], $arr); 在搜索过程中传递带空格的值时,一旦遇到空格,该值就会中断 例如: 36 2543541284 请注意6和2之间的空格。在类似的情况下,仅显示36 空格后的数字提示被忽略。这是给用户“找不到数据”的消息 我尝试使用urlencode添加20%,但没有成功 preg_match_all($pattern, rawurlencode($_GET[id]), $a

如果这个问题显得太便宜,请原谅我

我有一句话:

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;
函数格式($matches)
{
返回$matches[1][0]。(strlen($matches[2][0])>0?$matches[2][0]:“”.$matches[3][0]。(strlen($matches[4][0])>0?”。$matches[4][0]:“”);
}
//构造正则表达式
$pattern
='/'//正则表达式分隔符
. '('//捕获组的开始
'.\d{2}'//正好两位数字
.。)//捕获组结束
. '('//启动第二个捕获组
“.[ND]?”//字母“D”或“N”的任何顺序或数字-这是可选的
.。)//结束第二个捕获组
. '('//启动第三个捕获组
“.\d*”//任意位数
.。)//结束第三个捕获组
. '('//启动第四个捕获组
.'GG'//字母“GG”准确无误
.[\d]*'//任意位数
.。)//结束第三个捕获组
. '?'         // 将最后一个捕获组设置为可选
. '/'         // 正则定界符
;
preg_match_all($pattern,rawurlencode($\u GET[id]),$arr);
//重新格式化数组
$str=格式($arr);
//显示我们对数据所做的操作
回显“”。PHP_EOL;
回音“1…5…10…15…20…”。PHP_EOL;
回声模式;
echo PHP_EOL;
//我们得到我们想要的了吗?这是一个测试。如果我们对重新格式化的输出感到满意,我们将注释掉所有6行。
echo$str;
echo PHP_EOL;

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


如果您想获得关于正则表达式的进一步建议,则需要精确地指定规则。

在这种情况下,正则表达式是一种过分的做法

来自:

返回一个字符串,其中除
-\u0以外的所有非字母数字字符。
已替换为百分比(
%
)符号,后跟两个十六进制数字 和编码为加号(
+
)的空格。它的编码方式与 WWW表单中发布的数据进行编码,编码方式与中相同 应用程序/x-www-form-urlencoded媒体类型。这与编码(参见)不同,因为历史原因, 空格编码为加号(
+
)符号

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

代码示例:

输出:


$pattern
里面有什么?而且
36 2543541284
中的值是否得到['id']?我想在模式中添加一个空格。嗨@jOk和M42,我已经更新了上面的代码,以显示模式及其用途。我们定义了一些规则,比如所有值都是数字的任何ID,在第二个数字后面应该有一个空格。例如,该值362543541284应在第2位和第3位之间留有空格。此外,任何带有GG的数字,在GG之前都应该有一个空格。例如,36254354 GG1284问题,如上所述,当您在搜索框中输入362543541284时,它接受36并忽略空格后的所有内容。如果我不能自己解决问题,我会在以后发布更多的问题。您的正则表达式将不匹配两位数字,后跟一个空格,然后是更多的数字。如果需要,您可以将
[ND]?
更改为
[\sND]?
,但如果字符串不是全部数字,这也会允许一个空格。您需要精确地指定规则以获得正则表达式的帮助。@MikeM但它与两位数字匹配。如果所有值都是数字,它也会创建一个空格。如果在任何值中有GG字母,它也会在GG之前创建2个空格。问题是,这些空格正在破坏提供错误结果的值,我们希望在用户使用这些ID搜索时显示这些空格。如果数字有N或D但没有GG,则不应创建空格。我们需要规则指定的空间,但也不希望空间破坏这些值。这是urlencode在php中应该做的吗?我理解你的答案为什么描述url编码,因为这是OP的问题,他可能会发现这些信息很有用。但实际的问题是,不管空格是如何编码的,正则表达式都没有正确匹配输入字符串——无论是作为
+
还是
%20
还是仅仅作为空白。您的“过度杀戮”评论在这种情况下没有意义。@MikeM OP显然是在寻找一种更简单的方法,因此他对已经尝试过urlencode的评论(来源:OP:我也尝试过urlencode,但没有效果)。我的回答非常贴切。他的目标是对URL进行编码,我发布了最简单的方法。@thordarson,对不起,好人。我不知道我们还在就这篇文章进行对话。你们俩都有很好的观点。最初,我在寻找url编码,它会在空间中添加%20之类的内容。然而,当我手动操作时,即使这样也不能解决我的问题。事实上,我们的目标是在前两位数字后面有一个空格,而Mike向ND添加\s的解决方案提供了这个解决方案。我仍然有问题,尽管有些事情仍然是不正确的。我很快就会发帖。感谢大家在StackOverflow论坛上的好意。@Kenny您事先知道字符串的格式吗?因为如果你这样做了,有很多方法可以实现你所描述的
$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"
}