2015-12-08 17 views
6

Tôi đã viết regexp ^(?:([1-5])|([1-5]) .*|.* ([1-5])|.* ([1-5]) .*)$ để khớp với một chữ số độc lập 1-5 hoặc một chữ số được phân tách bằng ít nhất một khoảng trắng tạo thành phần còn lại của chuỗi. Tôi đã thử nghiệm nó trong các dịch vụ trực tuyến và kết quả là bản thân chữ số. Tuy nhiên, khi sử dụng mãTại sao preg_match trả về một số thành phần trống?

preg_match('/^(?:([1-5])|([1-5]) .*|.* ([1-5])|.* ([1-5]) .*)$/', 'order 12314124 5', $matches); 

tôi có được điều này:

Array ([0] => order 12314124 5 [1] => [2] => [3] => 5) 

Các [0] phần tử là một trận đấu đầy đủ đó là tốt. Tôi đoán yếu tố [1] là 5 nhưng nó trống rỗng, và có một nguyên tố trống khác. Tại sao các phần tử trống này xuất hiện?

Trả lời

3

Nếu bạn sử dụng regex tại regex101.com, tất cả các nhóm không tham gia (tức là những người không phù hợp) đều bị ẩn. Bạn có thể bật chúng lên trong các tùy chọn:

enter image description here

Và bạn sẽ nhìn thấy chúng:

enter image description here

Khắc phục nhanh là sử dụng một chi nhánh reset (?|...) thay vì một tổ chức phi chụp (?:...) và truy cập vào giá trị $matches[1]:

preg_match('/^(?|([1-5])|([1-5]) .*|.* ([1-5])|.* ([1-5]) .*)$/', 'order 12314124 5', $matches); 
print_r($matches[1]); // => 5 

Xem IDEONE demo

+1

cảm ơn bạn rất nhiều – onerror

Các vấn đề liên quan