Regex Pipe бар вопрос в PHP - PullRequest
       3

Regex Pipe бар вопрос в PHP

1 голос
/ 11 сентября 2010

У меня есть строка текста, которая выглядит как "... X ... Y ...", где X и Y оба - Ok, Empty или Open.Используя PHP, я пытаюсь использовать preg_match (), чтобы выяснить, что каждый из них.

$regex = '/(Ok|Open|Empty)/';
preg_match($regex, $match, $matches);
print_r($matches);

Однако, в случае, когда X "Пусто", а Y "Ок",строка дает мне два совпадения: «Пусто» и «Пусто».

Что не так с этим регулярным выражением?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 сентября 2010

preg_match() сделать только один матч, первый его найти. В вашем случае первое «Пусто».

Массив, возвращаемый preg_match(), содержит текст, соответствующий вашему регулярному выражению в первом слоте $matches[0]. Для каждой группы (в скобках) следующие слоты $matches будут содержать захваченный контент. В вашем случае у вас есть одна группа, содержащая «Пусто».

Результат будет $matches[0] == "Empty" и $matches[1] == "Empty"


Чтобы захватить все, что соответствует вашему регулярному выражению, вы должны использовать метод preg_match_all().

<?php

$match = "test Open test Empty test";

$regex = '/(Ok|Open|Empty)/';
preg_match_all($regex, $match, $matches);
print_r($matches);

?>

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

код на ideone


Ресурсы:

0 голосов
/ 11 сентября 2010

Вам нужно использовать preg_match_all() для нескольких результатов.Типичный массив совпадений построен следующим образом:

array(
    'Empty', // whole match
    'Empty'  // match group 1
)

Вы соответствуете только первому Ok, Open или пусто, но поскольку вы используете группу совпадений, он появляется дважды.

0 голосов
/ 11 сентября 2010

использование preg_match_all

...