2014-11-29 5 views
1

У меня длинная строка, и я пытаюсь извлечь конкретные данные, которые выделены в этой строке определенными словами.PHP Regular Expression - Извлечение данных

Например, здесь есть подмножество строки:

Current Owner 123 Capital Calculated 

Ищу извлечь

123 Capital 

и как вы можете видеть, она окружена «Текущим владельцем» (с пучок произвольных пространств) влево и «Вычислен» (опять же с произвольными пространствами) вправо.

Я пробовал это, но я немного новичок в RegEx. Может ли кто-нибудь помочь мне создать более эффективный RegEx?

preg_match("/Owner[.+]Calculated/",$inputString,$owner); 

Спасибо!

+0

Я вижу, что пробелы не отображаются в моем примере, но обратите внимание, что между словом «Текущий» и «Владелец» могут быть пробелы, а также после слова «Владелец» или перед словом «Рассчитано» ... все это очень произвольно сколько. –

+0

, чтобы получить пробелы для показа, вам нужно отступать с четырьмя пробелами/вкладкой или окружением с обратными окнами. Пользователь nu11p01n73R уже сделал это для вас в этом случае. –

ответ

1

Класс символов определяет набор символов. Saying ", матч один символ, указанный классом". Поместите точку . и квантификатор внутри группы capturing и включите модификатор s, который заставляет точку пересекать строки новой строки.

preg_match('/Owner(.+?)Calculated/s', $inputString, $owner); 
echo trim($owner[1]); 

Примечание:+ является greedy оператора, то есть он будет соответствовать столько, сколько он может и до сих пор позволяет остаток регулярного выражения, чтобы соответствовать. Используйте вместо этого +?, чтобы предотвратить жадность, означающую «один или несколько - желательно как можно меньше».

+0

, возможно, указывая на то, как работа с невращающимися модификаторами будет полезна для OP! – DRC

+0

ИМХО, в PHP. +? есть. * (нет жадной разницы, как я ее протестировал) – KyleK

+1

@KyleK '. +?' должен соответствовать любому символу (кроме новой строки) более одного раза, как можно меньше, но по-прежнему соответствовать шаблону, тогда как '. *' должен совпадать любой символ (кроме новой строки) 0 или более раз. Есть большая разница. –

0

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

(?<=Owner)\s*.*?(?=\s+Calculated) 

Примера использования

$str = "Current Owner 123 Capital Calculated "; 
preg_match("/(?<=Owner)\s*.*?(?=\s+Calculated)/", $str, $matches); 
print_r($matches); 

Даст выводное

Array ([0] => 123 Capital) 
0

Надеется, что это помогает, индекс группы # 1 ваша цель:

Owner\s+(\d+\s+\w+)\s+Calculated

Возможно, вы также попробуете инструмент, такой как RegExr, чтобы помочь вам учиться/возиться.