4

のいくつかの特殊文字(ユーロ記号など)の数を、次の正規表現$textを使用して数えています。preg_match_all

preg_match_all('/[\[|\]|€\{|}|\\|\^|\||~]/u', $text);

奇妙な理由で、PHPは3番目のパラメーターを要求します。ただし、preg_match_allのドキュメントによると、オプションであると想定されています。

警告:preg_match_all()は、少なくとも3つのパラメーターを想定しており、2つが指定されています。

私が提供する場合PREG_PATTERN_ORDER(なぜ私がすべきかわからない場合でも)私は得る:

パラメータ3を参照で渡すことはできません。

だから、私のコードの何が問題になっていますか?必要に応じて、関数全体を次に示します。

public function getMessageCount($text)
{
    $specials   = preg_match_all('/[\[|\]|€\{|}|\\|\^|\||~]/u', $text)
    $characters = strlen($text) + $specials;

    if(in_array(strtolower($this->method), self::$classic_plans)) :

        if($characters >= 0   && $characters <= 160) return 1;
        if($characters >= 161 && $characters <= 306) return 2;
        if($characters >= 307 && $characters <= 459) return 3;
        if($characters >= 460 && $characters <= 612) return 4;

        return 5;

    endif;

    if(in_array(strtolower($this->method), self::$basic_plans)) :

        if($characters >= 0    && $characters <= 160)  return 1;
        if($characters >= 161  && $characters <= 312)  return 2;
        if($characters >= 313  && $characters <= 468)  return 3;
        if($characters >= 469  && $characters <= 624)  return 4;
        if($characters >= 625  && $characters <= 780)  return 5;
        if($characters >= 781  && $characters <= 936)  return 6;
        if($characters >= 937  && $characters <= 1092) return 7;
        if($characters >= 1093 && $characters <= 1248) return 8;

        return 9;

    endif;

    return in_array(strtolower($this->method), self::$zero_plans) ? 1 : null;
}
4

4 に答える 4

4

5.4.0では3番目のパラメーターがオプションになりましたが、他の人がすでに言っているように、PREG_PATTERN_ORDERフラグを渡すと言ったため、3番目のパラメーターを渡してもコードはコンパイルされませんが、3番目のパラメーターは一致を受け取る配列であると想定され、4番目のパラメーターは国旗。

のようなものを使用してください:

<?php
$dummy = array();
echo("Result = ".preg_match_all('/[\[|\]|x\{|}|\\|\^|\||~]/', $text, $dummy));
?>
于 2012-05-28T18:28:48.947 に答える
2

PHP5.4.0からオプションになりました。

変更ログ

5.4.0matchesパラメータがオプションになりました。

于 2012-05-28T18:24:41.543 に答える
1

戻り値preg_match_allはint→一致数です。一致テキストは3番目のパラメーターに入力されます。

// incorrect
$specials = preg_match_all('/[\[|\]|€\{|}|\\|\^|\||~]/u', $text);      

// correct
$num = preg_match_all('/[\[|\]|€\{|}|\\|\^|\||~]/u', $text, $specials);
于 2012-05-28T18:28:09.407 に答える
1

提供したリンクの変更ログを確認してください。その後、PHPのバージョンを確認してください;)

于 2012-05-28T18:24:23.017 に答える