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 

我已经使用这个 RegEx 来提取课程名称和每门课程每周花费的时间。有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% 正确)来提取 RegEx 字符串。使用 $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

首先,(在正则表达式中修复了一些小问题之后)你可以在一个preg_电话中完成所有这些。方法如下:

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

$str可以是同时包含所有行的多行字符串。或者您可以一次传入一行。如果您一次传入所有行,$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]. 请注意,这两个内部数组对应于我在正则表达式中使用的圆括号内的内容。这些就是所谓的子模式,它们捕获额外的(子)匹配。也$matches[0]将始终包含整个模式的完整匹配,但在这种情况下您不需要它。

于 2012-09-27T19:11:14.137 回答