2010-04-06 42 views
5

Tôi đang đấu tranh nghiêm túc để có được đầu của tôi xung quanh regex.Trợ giúp Regex với thao tác chuỗi

Tôi có một sring với "iPhone: 52,973053, -0,021447"

tôi muốn trích xuất hai số sau dấu hai chấm vào hai chuỗi riêng biệt để giới hạn bởi dấu phẩy.

Có ai có thể giúp tôi không? Chúc mừng

Trả lời

2

Một giải pháp mà không sử dụng biểu thức thông thường, sử dụng explode()stripos() :):

$string = "iPhone: 52.973053,-0.021447"; 
$coordinates = explode(',', $string); 
// $coordinates[0] = "iPhone: 52.973053" 
// $coordinates[1] = "-0.021447" 

$coordinates[0] = trim(substr($coordinates[0], stripos($coordinates[0], ':') +1)); 

Giả sử rằng chuỗi luôn luôn chứa một dấu hai chấm.

Hoặc nếu nhận dạng trước dấu hai chấm chỉ chứa các ký tự (không số), bạn có thể làm cũng này:

$string = "iPhone: 52.973053,-0.021447"; 
$string = trim($string, "a..zA..Z: "); 
//$string = "52.973053,-0.021447" 

$coordinates = explode(',', $string); 
7

Hãy thử:

preg_match_all('/\w+:\s*(-?\d+\.\d+),(-?\d+\.\d+)/', 
    "iPhone: 52.973053,-0.021447 FOO: -1.0,-1.0", 
    $matches, PREG_SET_ORDER); 
print_r($matches); 

trong đó sản xuất:

Array 
(
    [0] => Array 
     (
      [0] => iPhone: 52.973053,-0.021447 
      [1] => 52.973053 
      [2] => -0.021447 
     ) 

    [1] => Array 
     (
      [0] => FOO: -1.0,-1.0 
      [1] => -1.0 
      [2] => -1.0 
     ) 

) 

Hoặc chỉ:

preg_match('/\w+:\s*(-?\d+\.\d+),(-?\d+\.\d+)/', 
    "iPhone: 52.973053,-0.021447", 
    $match); 
print_r($match); 

nếu chuỗi chỉ chứa một tọa độ.

Một lời giải thích nhỏ:

\w+  # match a word character: [a-zA-Z_0-9] and repeat it one or more times 
:  # match the character ':' 
\s*  # match a whitespace character: [ \t\n\x0B\f\r] and repeat it zero or more times 
(  # start capture group 1 
    -?  # match the character '-' and match it once or none at all 
    \d+ # match a digit: [0-9] and repeat it one or more times 
    \.  # match the character '.' 
    \d+ # match a digit: [0-9] and repeat it one or more times 
)  # end capture group 1 
,  # match the character ',' 
(  # start capture group 2 
    -?  # match the character '-' and match it once or none at all 
    \d+ # match a digit: [0-9] and repeat it one or more times 
    \.  # match the character '.' 
    \d+ # match a digit: [0-9] and repeat it one or more times 
)  # end capture group 2 
+0

Tôi tự hỏi nếu nó thực sự cần thiết để phù hợp với chữ số? Có thể đơn giản hơn nhiều để phân chia ở dấu hai chấm và dấu phẩy? (xin lỗi cho tôi nếu điều này là câm ;-) –

+0

Đó là một lựa chọn nếu chuỗi sẽ luôn luôn trông như thế. Nhưng có lẽ đầu vào thay đổi một chút hoặc kết hợp cũng được sử dụng để xác nhận. –

0

Hãy thử:

$string = "iPhone: 52.973053,-0.021447"; 

preg_match_all("/-?\d+\.\d+/", $string, $result); 
print_r($result); 
+0

Cảm ơn sự giúp đỡ tuyệt vời, đang làm việc như thế nào tôi muốn bây giờ: D – user310070

0

Tôi thích @ giải pháp phi regex Felix, tôi nghĩ rằng giải pháp của mình cho vấn đề này rõ ràng và dễ đọc hơn là sử dụng regex.

Đừng quên rằng bạn có thể sử dụng hằng số/biến để thay đổi tách bằng dấu phẩy hoặc dấu hai chấm nếu định dạng chuỗi gốc bị thay đổi.

Something như

define('COORDINATE_SEPARATOR',','); 
define('DEVICE_AND_COORDINATES_SEPARATOR',':'); 
0
$str="iPhone: 52.973053,-0.021447"; 
$s = array_filter(preg_split("/[a-zA-Z:,]/",$str)); 
print_r($s); 
0

Một giải pháp đơn giản hơn là sử dụng preg_split() với một regex đơn giản hơn nhiều, ví dụ

$str = 'iPhone: 52.973053,-0.021447'; 
$parts = preg_split('/[ ,]/', $str); 
print_r($parts); 

mà sẽ cung cấp cho bạn

Array 
(
    [0] => iPhone: 
    [1] => 52.973053 
    [2] => -0.021447 
)