2015-08-03 4 views
2

Какая функция лучше всего разбирает строки между определенными символами?Разбор больших текстовых полей

Например:

CHI 3 - MIN 0 

1st 
CHI - Kane (Seabrook, Toews) 

2nd 
CHI - Kane (Seabrook, Toews) 

3rd 
CHI - Kane (Seabrook, Toews) 

Так это boxscore хоккейной игры, первое имя является бомбардиром, а вторые два голевые.

мне нужно только захватить между "-" и "(" за $ голеадор

между "(" и "" за $ assist1

добавить между "" и ")" за $ assist2

Результат должен быть:

$goalscorer = Kane 
$assist1 = Seabrook 
$assist2 = Toews 

в конце концов я хочу сделать большой сценарий, где я могу вставить кучу boxscores и ч проведите петлю и добавьте «+1» в столбцы цели/помощи игроков. Но сейчас я хочу знать, как разбирать boxscore.

Большое спасибо за любую помощь!

+0

preg_match отлично работает, но, возможно, лучший вопрос в том, как вы читаете файл, file_get_contents? Анализируются ли данные по строкам, или вам нужно загрузить весь файл, что приведет к большой разнице в производительности. – ArtisticPhoenix

+0

Я, скорее всего, сделаю форму, чтобы вставить boxscore и вставить ее в строку. (не уверен, что это самая умная вещь.) – rolomcflurry

+0

Является примером полного ввода, который вы будете вставлять, или вы будете только вставлять в «строки оценки» (если это точное описание); например: «CHI - Kane (Seabrook, Toews)»? –

ответ

3

Вот это будет соответствовать тому, что у вас есть

https://regex101.com/r/yT7aW7/1

$str = "CHI - Kane (Seabrook, Toews)";  
preg_match('/^(\w+)\s-\s(?P<goalscorer>\w+)\s\((?P<assist1>\w+),\s(?P<assist2>\w+)\)$/', $str, $matches); 

английская

  • ^ Начало линии
  • \w Любой рабочий характер включает в себя A-Za-Z_
  • ( \ ш + ) захвата, более + затем один
  • \s Одиночная пространства
  • - дефис
  • ?P<name> именованный захват группы
  • \( или \) буквальные скобка, а oppesed на них захвата.
  • $ конец строки

большинство из них просто повторяет те, это действительно простое регулярное выражение.

+0

Выглядит неплохо, но как бы вы изменили его для всего boxscore? – rolomcflurry

+0

Что в целом boxscore – ArtisticPhoenix

+0

CHI 3 - MIN 0 первого CHI - Кейн (Сибрук, Toews) второго CHI - Кейн (Сибрук, Toews) третий CHI - Кейн (Сибрук, Toews) – rolomcflurry

1

Мне кажется, что вы спрашиваете о двух вещах: 1. Как обрабатывать результат вашего бокса и фильтровать соответствующие строки; 2. Извлечь конкретные значения из соответствующих строк.

Предполагая, что ваш boxscore доступен как переменная под названием $str, вы можете просто взорвать его на своих новых строках, перебрать результат, фильтровать нужные строки и затем извлечь значения из этих строк.

Что-то, как это довольно механические, но должны работать, учитывая ваш пример входного сигнала выше:

<?php 

$str = <<<STR 
CHI 3 - MIN 0 

1st 
CHI - Kane (Seabrook, Toews) 

2nd 
CHI - Kane (Seabrook, Toews) 

3rd 
CHI - Kane (Seabrook, Toews) 
STR; 

// split boxscore input on newlines 
// to create an array of lines 
$lines = explode(PHP_EOL, $str); 

// iterate over lines 
// filter each line... ignore zero-length lines 
// check if the last char is ')' 
// preg_split on filtered lines 
// assign to vars 
// etc. 
foreach ($lines as $line) { 
    $len = strlen($line); 
    if ($len && $line[$len - 1] === ')') { 
     $matches = preg_split('/^\w{3}\s+-\s+|\s+\(|,\s+|\)/', $line, null, PREG_SPLIT_NO_EMPTY); 
     list($goalscorer, $assist1, $assist2) = $matches; 
     // do whatever you want with `$goalscorer`, `$assist1`, `$assist2` 
    } 
} 

Конечно, каждая итерация будет перезаписывать значения $goalscorer, $assist1 и $assist2, но я просто иллюстрируя, что вы можете сделайте все, что захотите, с этими значениями на этом этапе, вы можете выполнять дальнейшие операции или записывать их в массив или что-то еще, что пока не выходит за рамки вопроса.

Регулярное выражение, вероятно, немного неэлегантно; он должен работать на странные двухствольные и переносимые фамилии.

Надеюсь, это поможет! :)

+0

Такие умные люди здесь! Спасибо, Darragh! – rolomcflurry

+0

Нет проблемa! Для этого мы здесь. Рад помочь! –

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