2015-09-24 3 views
0

мне нужно получить некоторые данные для каждой строки большой строки в том виде:процесса строка строка за строкой и разделить содержание в переменные

  1. пустая строка должна игнорироваться
  2. Если нет | вообще -> $ содержание = $ значение
  3. Если есть один | -> первая часть будет $ содержание, вторая часть (если существующее место) будет $ более
  4. Если есть два | -> текст в средний будет $ content, последняя часть будет $ more

пример

|text| 
text 
another|text|example 

have fun| 
text|more text 
|| 
|just some keywords (25-50%)| 

результат

$content = 'text' 
$content = 'text' 
$content = 'text'; $more = 'example'; $pre = 'another' 
$content = 'have fun' 
$content = 'text'; $more = 'more text' 
$content = just some keywords (25-50%)' 

Так что я пытался решить эту вещь с взрываются и если/другое, но я не смог с этим:

$lines = explode(PHP_EOL, $content); 
foreach ($lines as $key => $value) { 
    if ($line != "") { 
     $line_array = explode("|", $value); 
     if(count($line_array) == 3) { 
      // is '|anything|' or 'x|y|z' 
     } 
     else if (count($line_array) == 1) { 
      // anything else 
     } 
    } 
} 

REGEX

Моя попытка (.*)\|(.*)\|(.*)$ получает все строки, которая имеет два |, но не другие линии ...

https://regex101.com/r/yW7oR3/5

+0

Это очень похоже на ваш последний регулярное выражение вопрос. Попробуйте несколько регулярных выражений и опубликуйте свои попытки. – chris85

+0

Я хотел бы создать регулярное выражение, но это слишком сложно для меня, так как строки имеют совсем другой формат (для меня). Вот почему я прошу о помощи. – user3848987

ответ

1

/(?:^|^([^\|]+))\|?([^\|]+)\|?(?:$|([^\|]+)$)/gm, похоже, работает,
см. https://regex101.com/r/yW7oR3/6, чтобы проверить его.

Я проектировал это нравится:

  • $ 1 = $ предварительно
  • $ 2 = $ содержание
  • $ 3 = $ более
-2

Что случилось с вашим "не удалось" подход? Вот он с недостающим кодом ...

$lines = explode(PHP_EOL, $content); 
foreach ($lines as $line) { 
    $line = trim($line) 
    if ($line !== "") { 
     $parts = explode("|", $line); 
     if (count($parts)==1) { 
      $content = $parts[0]; 
     } else if (count($parts)==2) { 
      $content = $parts[0]; 
      $more = $parts[1]; 
     } else if (count($parts)==3) { 
      $content = $parts[1]; 
      $more = $parts[2]; 
     } else { 
      echo 'Invalid - more than 2 "|"'; 
     } 
    } 
} 

Этот код следует за вашим описанием на английском языке.

+0

Отсутствует ';', -> '$ line = trim ($ line)' – chris85

+0

Моя попытка не является ошибкой, но я думаю, что не очень умно использовать несколько, если вы используете один regEx, не так ли? – user3848987

+0

(Jeez, почему пустые голоса?) Что касается того, является ли одно регулярное выражение более умным, чем множественным ifs, я думаю, это зависит от вашей цели: магического или поддерживаемого кода. Томас 'regex выше волшебный, я уверен, что это правильно (я думаю), но это займет большинство читателей этого кода, чтобы понять его и даже дольше поддерживать/обновлять его для нового требования. Однако множественные ifs читаются почти так же, как ваши письменные спецификации, и, я считаю, было бы легче поддерживать/обновлять. Но это только мое скромное мнение. Пожалуйста, не голосуйте меня больше :) – BareNakedCoder

Смежные вопросы