2

コースのリストと、学生が受講するのに必要な時間のリストがあります。コースは次のとおりです。

CON8101 Residential Building/Estimating 16 hrs/w 
CON8411 Construction Materials I 4 hrs/w 
CON8430 Computers and You 4 hrs/w 
MAT8050 Geometry and Trigonometry 4 hrs/w 

私はこの正規表現を使用して、コースの名前と各コースが毎週かかる時間を抽出しました。4つ以上のコースがあります。4つは上記の例です。50ものコースがあります。

$courseHoursRegEx = "/\s[0-9]{1,2}\shrs/w/";
$courseNameRegEx = "/[a-zA-Z]{3}[0-9]{4}[A-Z]{0,1}\s?/[a-zA-Z]{3,40}/";

そして、次の関数を適用して(100%正しいかどうかはわかりません)、正規表現の文字列を抽出します。$ courseLineの使用は、私が以前に開いたテキストドキュメントから各行の文字列を保存した変数です。文字列から抽出された合計時間を追跡します。

$ coursesは、ユーザーがhtmlセクションに入力するチェックボックスの配列です。

$totalHours += GetCourseHours($courseLine);
function GetCourseHours($couseLine)
    {
        if(!preg_match($courseHoursRegEx, $courseLine))
            {
                return $courseLine;
            }
    }
function GetCourseName($courseLine)
    {
        if(!preg_match($courseNameRegEx, $courseLine))
            {
                return $courseLine;
            }
    }

foreachループを使用して、選択したすべてのコースを出力し、テーブルに分類しました。

foreach($courses as $course)
    {
    $theCourse = GetCourseName($course);
    $theHours = GetCourseHours($course)
    }

編集:出力コード

for($i = 1; $i <= $courses; ++$i)
{
printf("<tr><td>\$%.2f</td><td>\$%.2f</td></tr>", $theCourse, $theHours);

}

自分が持っているものを、コース名と各コースの時間で整理された動的テーブルに出力する方法がわかりません。ページを実行できず、構文エラーも見つかりません。それが私のロジックであると心配していました。

4

1 に答える 1

1

まず第一に、(正規表現内のいくつかのマイナーなことを修正した後)1回のpreg_呼び出しですべてを行うことができます。方法は次のとおりです。

preg_match_all("~([a-zA-Z]{3}\d{4}[A-Z]{0,1}\s.+)\s(\d{1,2})\shrs/w~", $str, $matches);

$str一度にすべての行を含む複数行の文字列にすることができます。または、一度に1行ずつ渡すこともできます。すべての行を一度に渡すと、$matches後で次のようになります。

Array
(
    [0] => Array
        (
            [0] => CON8101 Residential Building/Estimating 16 hrs/w
            [1] => CON8411 Construction Materials I 4 hrs/w
            [2] => CON8430 Computers and You 4 hrs/w
            [3] => MAT8050 Geometry and Trigonometry 4 hrs/w
        )

    [1] => Array
        (
            [0] => CON8101 Residential Building/Estimating
            [1] => CON8411 Construction Materials I
            [2] => CON8430 Computers and You
            [3] => MAT8050 Geometry and Trigonometry
        )

    [2] => Array
        (
            [0] => 16
            [1] => 4
            [2] => 4
            [3] => 4
        )

)

これで、のすべての名前を繰り返し処理し$matches[1]て、の時間を合計することができます$matches[2]。これらの2つの内部配列は、正規表現で使用した丸括弧の内側に対応していることに注意してください。これらはいわゆるサブパターンと呼ばれ、追加の(サブ)一致をキャプチャします。また$matches[0]、常にパターン全体の完全一致が含まれますが、この場合は必要ありません。

于 2012-09-27T19:11:14.137 に答える