2016-06-10 2 views
1

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

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

В этом примере оно соответствует первому и второму номерам до слова «Субъект», я хочу, чтобы он получил число, самое близкое к слову «Тема», в то время как число еще осталось перед словом. Это может быть несколько экземпляров, которые мне нужно обнаружить внутри документа. Текст может распространяться на несколько строк. Единственная часть, которую мне нужно захватить, - это номер телефона, а остальная часть - группа захвата.

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

Пример

RegEx

([0-9]{3}\-[0-9]{3}\-[0-9]{4})(?:\w|\s|\-|\')+\bSubject\b 

Раздел:

123-456-7890 - ABC WHAT 
MERICA RULES 
987-654-3210 - ABC WHAT WORDS MORE WORDS 123456789123 
LOREM IPSOM WHO CARES - Subject 

ответ

0

Вы можете соответствовать все с модификатором g ЛОБАЛЬНЫЕ, а затем взять последний матч?

/(\d{3}-\d{3}-\d{4})(?=.*\bSubject\b)/sg 

s Ingle линия делает . матч новой строки, а также.

И в PHP:

<?php 
$input = '123-456-7890 - ABC WHAT 
MERICA RULES 
987-654-3210 - ABC WHAT WORDS MORE WORDS 123456789123 
LOREM IPSOM WHO CARES - Subject 
ANOTHER NOT MATCHES BECAUSE AFTER subject 111-111-1111'; 

preg_match_all('/(\d{3}-\d{3}-\d{4})(?=.*\bSubject\b)/s', $input, $matches); 

echo array_pop($matches[1]); // 987-654-3210 
?> 

Try it online

+0

Это не работает, если скопировать и вставить свой вклад дважды в регулярное выражение тестер, то 111-111-1111 подобран. https://regex101.com/r/gV1aO3/3 – sudoroot

+0

@ user2078965 Это потому, что у вас есть «Тема» позже в тексте. – andlrc

+0

Это одна из моих проблем, она будет происходить несколько раз в документе, и мне нужно ее обнаружить. – sudoroot