Trong các biểu thức so mẫu(Cơ bản về RegExp) chúng ta sử dụng #s để lấy dữ liệu trên nhiều dòng, và thường mắc phải trường hợp sau:
<?php
$str = "Đây là đoạn so mẫu cần lấy<start>Text1</start> thứ nhất và cần lấy <start>Text2</start> thứ 2";
//so mẫu
preg_match_all('#<start>(.*)</start>#s',$str,$array);
print_r($array);
?>
Kết quả:
Array
(
[0] => Array
(
[0] => <start>Text1</start> thứ nhất và cần lấy <start>Text2</start>
)
[1] => Array
(
[0] => Text1</start> thứ nhất và cần lấy <start>Text2
)
)
Như vậy so mẫu trên sẽ lấy ra nguyên chuỗi <start>Text1</start> thứ nhất và cần lấy <start>Text2</start> và chuỗi này không như mong đợi, cái ta cần lấy phải là 2 chuỗi riêng biệt <start>Text1</start> và <start>Text2</start>
Để giải quyết cái này, bạn có thể thực hiện đơn giản bằng cách thêm ? vào câu so mẫu trên, và câu so mẫu sẽ được viết lại như sau:
<?php
$str = "Đây là đoạn so mẫu cần lấy<start>Text1</start> thứ nhất và cần lấy <start>Text2</start> thứ 2";
//so mẫu
preg_match_all('#<start>(.*?)</start>#s',$str,$array);
print_r($array);
?>
và kết quả:
Array
(
[0] => Array
(
[0] => <start>Text1</start>
[1] => <start>Text2</start>
)
[1] => Array
(
[0] => Text1
[1] => Text2
)
)
Nhờ phát hiện này TG đã sữa lại phần BBcode lỗi bấy lâu của phpbasic.com :)
Tác giả:TG
Webmaster
http://phpbasic.com
