2016-05-17 3 views
0

В основном мой preg_match работает нормально. Однако, когда существует только частичное значение текста (а не цифр), мне нужно знать, что попытка пыталась ввести правильную вещь.preg_match как знать частичное значение

Пример 1:

$text = "2000 FC 
2 A 
100 FH 
1200 ACT FC 
"; 

Пример 2:

$text = "2000 FC 
2 A 
100 FH 
ACT FC 
"; 

КОД:

preg_match("~(?P<value>\d+(?:.\d+)*?)\h(?P<unit>ACT\sFC)~", $text, $act_fc); 

Пример 1 показывает правильный текст "1200 АКТ FC". При выполнении preg_match 1200 присваивается значение, а ACT_FC присваивается единицам в массиве $ act_fc.

Однако, если существует случай, подобный примеру 2, только с «ACT FC», тогда массив $ act_fc пуст.

Не выполняя другой preg_match для проверки только для «ACT FC», есть ли способ вернуть ACT_FC? Возможно, «единица» может быть принудительно заполнена массивом, а «значение» может быть нулевым.

ПРИМЕЧАНИЕ. Я занимаюсь сопоставлением данных между новыми строками, поэтому часть кода важна, чтобы оставаться практически такой же.

+1

Здесь нет причин использовать не-жадный квантификатор: '(?:. \ D +) *?'. Не забывайте, что точка означает любой символ (кроме новой строки), а не буквальную точку. Чтобы увидеть буквальную точку, вам нужно сбежать от нее: '\ .'. Если вам нужно сделать что-то необязательное, используйте квант '?'. –

ответ

3

Вы можете сделать значение частью опционально с (?:...)?:

preg_match("/(?:(?P<value>\d+(?:\.\d+)*?)\h)?(?P<unit>ACT\sFC)/", $text, $act_fc); 

Вот demo. И вот regex tester.

+1

В этом случае лучше использовать группу, не связанную с захватом. –

+0

Да, вы правы. Спасибо. Обновленный ответ. – sevavietl

+0

Это отлично работает, за исключением случаев, когда пространство отсутствует. Как 1200ACT FC – no1uknow