2011-04-20 60 views
1

我是新来的正则表达式,真的没有线索。 我有一个MySQL表看起来像这样:mysql搜索的过滤文本

id | grade | subject | kind | tally 
1 | 11 | M  | L | 1 
2 | 11 | E  | L | 3 
3 | 11 | D  | G | 1 
4 | 11 | GK  | G | 1 
5 | 11 | SPA  | G | 6 

你的想法... :)

级是一个int,无论是11,12或13 主题是一个字符串,之间1 -4“chars”长。 类型是“L”或“G”。 Tally是一个int,介于1和6之间。

此表应该包含所有在我学校的课程/课程。 当你写出类名时,它看起来像这样的“11EL4”或“11ML1”。

我希望能够将这个“描述”转化为等级,主题,种类和计数。 例如:

function descriptionToArray($description){ 
    // $grade = regex voodoo :) 
    // $subject = regex voodoo :) 
    // ... 

    return array("grade"=>$grade,"subject"=>$subject,...); 
} 

我的猜测会一直正则表达式,但我真的不知道如何工作的,如果你想提取档次,不同的变量,以主题或实物(即使教程)

+0

我通过阅读http://gskinner.com/RegExr/的不同选项descrptions与玩弄学会正则表达式表示工具。如果你花时间玩它,效率非常高。 – Maritim 2012-12-06 07:23:43

回答

3

尝试这种情况:

if (preg_match('/(11|12|13)([A-Z]{1-4})(L|G)([1-6]{1})/', $class_string, $match)) { 
    list($dummy, $grade, $subject, $kind, $tally) = $match; 
} 

说明:

  • (11|12|13)匹配11,12或13
  • ([A-Z]+?)匹配1个或多个大写字母(ungreedy )
  • (L|G)匹配的LG
  • ([1-6]{1})一个单一的数字,因为$match[0]将容纳整个正则表达式匹配1-6

$dummy的需要的范围内相匹配。元素1-4将保存每个专有子字符串。

+0

这看起来相当不错,但是当我输入内容时它总是返回错误:( – JNK 2011-04-20 09:41:32

+0

尝试preg_match_all,因为在某些行中有多个相同的字符。 – 2011-04-20 09:48:17

+0

仍然没有... :( – JNK 2011-04-20 10:09:59

0

那么为什么不使用mysql_query来获取这些变量呢。 如果您想从表中的数据创建类名,那么从mysql_query获取这些变量并连接以形成您的类名。 并使其成为一个数组将这些变量放入数组中。

例如:

//establish the mysql connection and select the database. 

$query = mysql_query("SELECT * FROM class"); //Where class is your table name 

while ($row = mysql_fetch_array($query)) { return array($row["grade"], $row["subject"], $row["kind"]); } 

//Then use that array for whatever you want to use it for. Also assign a variable to it to use it outside the while loop. 
+0

lateron我想获取描述的ID。例如:idOfDesc(“11EL3”)= 2。为此,我将需要不同的部分... – JNK 2011-04-20 09:25:07

+0

然后使用implode来形成所有值的一行。然后使用explode来形成字符串中每个值的数组。为了使其可用,请在for或while循环中执行此操作,并在每个字符串中分配一个变量,然后递增到新变量的下一个数字。 – 2011-04-20 09:33:36

+0

这只适用于每部分长度为1个字符的情况。我会使用哪种胶水和分离器?...我想你错过了我的问题... – JNK 2011-04-20 09:38:07

1

没有太多的巫术,没有正则表达式还挺简单的解决方案可能是:

function descriptionToArray($description){ 
    $grade = substr($description, 0, 2); 
    $subject = substr($description, 2, strlen($description)-4); 
    $kind = substr($description, -2, -1); 
    $tally = substr($description, -1); 

    return array("grade" => $grade, "subject" => $subject, "kind" => $kind, "tally" => $tally); 
}