Php 这个脚本使用正则表达式的最佳方法是什么?

Php 这个脚本使用正则表达式的最佳方法是什么?,php,regex,if-statement,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种不同的格式。漫画、精装本、平装本。我正在从另一个网站获取数据,下面列出了我在这个特定领域的当前代码

$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);
$number=preg_match(“/((漫画))[^A-Za-z]+/”,$string,$fields);
if//检查值是否为漫画
{$cat=数组(1,4,5);}
其他的
如果//检查值是否为精装本
{$cat=数组(2,4,5);}
否则//如果不是精装本或漫画书,则必须是平装本
$cat=阵列(3,4,5);

但是……你会怎么设置呢?还是有更好的方法?

我想你想要这样的:

  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
的预期结构是什么?目前,它将匹配任何包含“精装本”(或“漫画”或“平装本”)的文字,然后匹配任何非字母的字符一次或多次。这是你想要的吗

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


编辑以合并巴斯蒂的建议(使用
$fields
而不是三个单独的
预匹配)。

我想你想要这样的东西:

  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
的预期结构是什么?目前,它将匹配任何包含“精装本”(或“漫画”或“平装本”)的文字,然后匹配任何非字母的字符一次或多次。这是你想要的吗

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


编辑以合并巴斯蒂的建议(使用
$fields
而不是三个单独的
preg\u match
项)。

您可以使用查找数组:

$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]+/';

您可以使用查找数组:

$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]+/';

工作得很漂亮,谢谢!这个脚本中唯一剩下的我花了好几天的时间却弄不明白的事情就是如何在这个网站的权重区域中放置数据。你用一个数字值来设置重量,然后磅、盎司等就会下降。这个插件就是WP电子商务。你知道如何访问自定义元吗?非常好,谢谢!这个脚本中唯一剩下的我花了好几天的时间却弄不明白的事情就是如何在这个网站的权重区域中放置数据。你用一个数字值来设置重量,然后磅、盎司等就会下降。这个插件就是WP电子商务。你知道如何访问自定义元数据吗?