使用正则表达式编写此脚本的最佳方法?

时间:2012-04-01 10:08:02

标签: php regex if-statement

我想根据要插入的图书的格式来分配类别。假设有3种不同的格式。漫画,精装本,平装本。我从其他网站提取数据,下面列出了我对这个特定区域的当前代码。

$string = $item2['data'];   
$number = preg_match("/((Comic)|(Hardcover)|(Paperback))[^A-Za-z]+/", $string, $fields);
$format = $fields[1];   

输出是漫画,精装或平装本

三个父类别是漫画(1),精装(2),平装本(3) 儿童类别:制造商(4),系列(5)

(#)是每个的类别ID。

我的想法是这样的。

$number = preg_match("/((Comic))[^A-Za-z]+/", $string, $fields);

if <what goes here for true?> //check to see if value is a comic
    {$cat = array(1,4,5);}
    else
        if <what goes here for true?> //check to see if value is a hardback
            {$cat = array(2,4,5);}
            else                     // if not hardback or comic it must be a paperback
               $cat = array(3,4,5);

但是.....你会怎么设置它?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用查找数组:

$lookup = array(
    'Comic'     => 1,
    'Hardcover' => 2,
    'Paperback' => 3
); 
if (preg_match("/(Comic|Hardcover|Paperback)[^A-Za-z]+/", $string, $match)) {
    $cat = array($lookup[$match[1]], 4, 5);
}

有了这个,您甚至可以从数组键构建模式:

$pattern = '/(' . implode('|', array_map(function($key) { return preg_quote($key, '/'); }, array_keys($lookup))) . ')[^A-Za-z]+/';

答案 1 :(得分:1)

我想你想要这样的东西:

  preg_match("/(Comic|Hardback|Paperback)[^A-Za-z]+/", $string, $fields);

  switch ($fields[1])
  {

    case ('Comic'):
      $cat = array(1, 4, 5);
      break;

    case ('Hardback'):
      $cat = array(2, 4, 5);
      break;

    case ('Paperback'):
      $cat = array(3, 4, 5);
      break;

    default:
      // Do something if none of above

  }

虽然$string的预期结构是什么?目前,它将匹配包含单词“精装本”(或“漫画”或“平装本”)的任何内容,然后匹配任何不是字母一次或多次的字符。这是你想要的吗?

另请注意,我已明确检查了Paperback并包含了默认值。将来可以更容易地添加其他类型,或者如果给定的数据不是上述类型(你能确定它只会是这三种中的一种吗?)

已修改纳入 Basti 的建议(使用$fields而不是三个preg_match个。)