0

この質問が安っぽく見える場合は、ご容赦ください。

私はこの行を持っています:

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;
4

2 に答える 2

0

この場合、正規表現はやり過ぎです。

urlencodeマニュアルから:

英数字以外のすべての文字-_. がパーセント()記号に置き換えられ、%その後に2つの16進数字とスペースがプラス(+)記号としてエンコードされた文字列を返します。これは、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"
}
于 2013-01-28T18:48:45.093 に答える
0

現状の正規表現は、2桁の後にスペースとそれ以上の桁が続くものとは一致しません。
必要に応じて、に変更できますが[ND]?[\sND]?文字列がすべて数字でない場合はスペースも使用できます。

正規表現についてさらにアドバイスが必要な場合は、ルールを正確に指定する必要があります。

于 2013-01-28T18:05:49.033 に答える