【问题标题】:Filter text for mysql search过滤文本以进行 mysql 搜索
【发布时间】:2011-04-20 09:09:43
【问题描述】:

我是正则表达式的新手,真的不知道。 我有一个如下所示的 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

你明白了...:)

Grade 是一个整数,11,12 或 13。 主题是一个字符串,长度在 1-4 个“字符”之间。 种类是“L”或“G”。 Tally 是一个整数,介于 1 和 6 之间。

这张桌子应该可以容纳我学校的所有课程/课程。 当你写出类名时,它看起来像“11EL4”或“11ML1”。

我希望能够将这个“描述”转化为年级、科目、种类和计数。 例如:

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

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

我的猜测是正则表达式,但我真的不知道它是如何工作的(即使在教程之后)

【问题讨论】:

  • 我通过阅读gskinner.com/RegExr 上不同选项的描述并使用所述工具来学习正则表达式。如果您花时间玩它,效率会很高。

标签: php mysql regex filter


【解决方案1】:

试试这个:

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 个或多个大写字母(不贪心)
  • (L|G) 匹配 LG
  • ([1-6]{1}) 匹配 1-6 范围内的单个数字

$dummy 是必需的,因为$match[0] 将保存整个正则表达式匹配。元素 1-4 将包含每个获得专利的子字符串。

【讨论】:

  • 这看起来很不错,但是当我输入一些东西时它总是返回 false :(
  • 试试 preg_match_all 因为在某些行中有超过 1 个相同的字符。
  • 我发现了问题。 ([A-Z]{1,4}) 正在消耗它后面的 L 或 G,如果它只有 1-3 个字符长。我不知道如何解决这个问题。我正在寻找解决方案,如果(如果)找到解决方案,我会在此处更新。
  • 我修好了。我把主题匹配变成了一个不贪心的([A-Z]+?)
【解决方案2】:

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

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);
}

【讨论】:

    【解决方案3】:

    如果你想在不同的变量中提取等级、学科或种类来对这些变量做一些事情,那么为什么不使用 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.
    

    【讨论】:

    • latron 我想获取描述的 ID。示例:idOfDesc("11EL3") = 2。为此,我需要不同的部分...
    • 然后使用 implode 将所有值组成一行。然后使用explode形成字符串中每个值的数组。为了使它可用,在for或while循环中执行它并在每个字符串中分配一个变量,然后为新变量递增到下一个数字。
    • 这只有在每个部分都是 1 个字符长的情况下才有效。我会使用哪种胶水和分离器?...我想您误解了我的问题...
    • 内爆和爆炸对字符没有限制。但是,我想我误解了你的问题。对不起...
    猜你喜欢
    • 2012-10-23
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2018-06-21
    相关资源
    最近更新 更多