Làm thế nào để trở lại chỉ nhóm được đặt tên với preg_match hoặc preg_match_all?
Hiện tại không thể thực hiện (PHP7). Bạn sẽ luôn nhận được một mảng kiểu hỗn hợp, chứa các phím số và có tên.
Cho phép trích dẫn hướng dẫn PHP (http://php.net/manual/en/regexp.reference.subpatterns.php):
subpattern này sau đó sẽ được lập chỉ mục trong mảng các trận đấu bởi vị trí số bình thường của nó và cũng có thể theo tên.
Để giải quyết vấn đề các đoạn mã sau đây có thể giúp:
1. lọc mảng bằng cách sử dụng một kiểm tra is_string trên mảng phím (ví PHP5.6 +)
$array_filtered = array_filter($array, "is_string", ARRAY_FILTER_USE_KEY);
2.foreach qua các yếu tố và unset nếu chìa khóa mảng is_int() (tất cả các phiên bản PHP)
/**
* @param array $array
* @return array
*/
function dropNumericKeys(array $array)
{
foreach ($array as $key => $value) {
if (is_int($key)) {
unset($array[$key]);
}
}
return $array;
}
của một hàm PHP đơn giản đặt tên dropNumericKeys()
. Của nó cho sau xử lý của một mảng phù hợp sau khi chạy preg_match*()
sử dụng các nhóm được đặt tên cho phù hợp. Các hàm chấp nhận $array
. Nó lặp lại mảng và loại bỏ/bỏ chọn tất cả các khóa với kiểu số nguyên, để lại các khóa với kiểu chuỗi bị ảnh hưởng. Cuối cùng, hàm trả về mảng bằng các khóa có tên "now".
Lưu ý: Chức năng dành cho tính tương thích xuống của PHP. Nó hoạt động trên tất cả các phiên bản. Giải pháp array_filter
dựa trên hằng số ARRAY_FILTER_USE_KEY
, chỉ khả dụng trên PHP5.6 +. Xem http://php.net/manual/de/array.constants.php#constant.array-filter-use-key
Nguồn
2016-01-11 14:21:40
Trong các mảng nhỏ, điều này không gây ra vấn đề gì nhưng rất lớn với nhiều mẫu có thể có vấn đề với nhu cầu bộ nhớ cao. Thứ hai, nó trông sạch hơn theo cách đó và sẽ có (với công cụ sửa đổi không tồn tại này) một dòng mã ít hơn, do đó ít khả năng xảy ra lỗi hơn. – rsk82
Hoàn toàn ngược lại: bởi vì điều này không thể được thực hiện bởi PCRE, bạn phải thêm nhiều mã hơn, nơi có thể có nhiều vấn đề hơn. – Charles
Tôi có nghĩa là các phần tử bổ sung trong mảng. – Maerlyn