Лучший метод с использованием регулярных выражений для этого сценария? - PullRequest
0 голосов
/ 01 апреля 2012

Я хочу назначить категории на основе формата книги, которая будет вставлена.Допустим, есть 3 разных формата.комикс, переплет, мягкая обложка.Я извлекаю данные с другого веб-сайта, и текущий код, который у меня есть для этой конкретной области, приведен ниже.

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

Вывод может быть комическим, в твердом переплете или в мягкой обложке

с тремя родителямиКатегории: Комикс (1), Твердый переплет (2), Мягкая обложка (3) Дочерние категории: Производитель (4), Серия (5)

(#) - это идентификаторы категорий для каждого.

Моя идея примерно такая.

$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 ]

2 голосов
/ 01 апреля 2012

Вы можете использовать массив поиска:

$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 голос
/ 01 апреля 2012

Я думаю, вы хотите что-то вроде этого:

  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?На данный момент он будет совпадать со всем, что содержит слово «Hardback» (или «Comic» или «Paperback»), а затем с любыми символами, которые не являются буквами один или несколько раз.Это то, что вы хотите?

Обратите внимание, что я явно проверил наличие мягкой обложки и включил значение по умолчанию.Было бы проще добавлять другие типы в будущем или если данные данные не относятся к вышеперечисленным (можете ли вы быть уверены, что они когда-либо будут только одним из этих трех?)Предложение Басти (с использованием $fields вместо трех отдельных preg_match es).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...