2010-01-20 31 views
5

Tôi đang sử dụng số preg_split của php để phân tách một chuỗi dựa trên dấu chấm phẩy, nhưng tôi cần nó để chỉ phân tách trên dấu chấm phẩy không thoát.Regex để tách trên tất cả các dấu chấm phẩy không thoát hình

<? 
$str = "abc;def\\;abc;def"; 
$arr = preg_split("/;/", $str); 
print_r($arr); 
?> 

Tạo:

Array 
(
    [0] => abc 
    [1] => def\ 
    [2] => abc 
    [3] => def 
) 

Khi tôi muốn nó để sản xuất:

Array 
(
    [0] => abc 
    [1] => def\;abc 
    [2] => def 
) 

Tôi đã thử "/(^\\)?;/" hoặc "/[^\\]?;/" nhưng cả hai đều tạo ra lỗi. Bất kỳ ý tưởng?

+1

@Corey, tại sao dấu chấm phẩy được thoát nếu bạn không muốn nó trong kết quả cuối cùng của mình? –

+0

@Doug Typo, thêm dấu chấm phẩy vào đầu ra cuối cùng –

+0

Có thể thoát được thoát không? Nói cách khác, một chuỗi ký tự có dạng như sau: '" abc; def \\\; abc; def "' (được chia thành: '[abc, def \\, abc, def'])? –

Trả lời

5

này hoạt động.

<? 
    $str = "abc;def\;abc;def"; 
    $arr = preg_split('/(?<!\\\);/', $str); 
    print_r($arr); 
?> 

Nó ra:

Array 
(
    [0] => abc 
    [1] => def\;abc 
    [2] => def 
) 

Bạn cần phải sử dụng một lookbehind âm (read about lookarounds). Hãy suy nghĩ về "phù hợp với tất cả ';' trừ khi có tiền tố '\' ".

+0

Cảm ơn bạn đã liên kết! –

+0

Điều đó sẽ hoạt động trừ khi bạn có phần tử kết thúc bằng dấu gạch chéo ngược - không có cách nào để thoát khỏi dấu gạch chéo ngược đó, vì regex có vẻ như nó đang thoát dấu chấm phẩy. – Ariel

2

Tôi không thực sự thành thạo với regexes PHP, nhưng hãy thử điều này:

/(?<!\\);/ 
+0

Nó cần phải là một triple '\'. Chỉ sử dụng 2 lỗi được tạo ở đây. Không chắc tại sao lại như vậy. –

+0

Câu trả lời của bạn hoạt động với triple '\', nhưng Nils đã đi thêm bước để giải thích lý do. Nhận +1 cho nỗ lực! –

0

Vì Bart hỏi: Tất nhiên bạn cũng có thể sử dụng regex để tách trên không thoát; và lấy các ký tự thoát hiểm thoát ra. Nó chỉ được một chút lộn xộn:

<? 
    $str = "abc;def\;abc\\\\;def"; 
    preg_match_all('/((?:[^\\\\;]|\\\.)*)(?:;|$)/', $str, $arr); 
    print_r($arr); 
?> 

Array 
(
    [0] => Array 
     (
      [0] => abc; 
      [1] => def\;abc\\; 
      [2] => def 
    ) 

    [1] => Array 
     (
      [0] => abc 
      [1] => def\;abc\\ 
      [2] => def 
    ) 
) 

Điều này không có gì để mất một biểu thức chính quy cho “(bất kỳ ký tự trừ \ và;) hoặc (\ tiếp theo bất kỳ ký tự)” và cho phép bất kỳ số lượng những người, tiếp theo bởi a; hoặc kết thúc chuỗi.

Tôi không chắc cách php xử lý các ký tự $ và cuối dòng trong một chuỗi, bạn có thể cần phải đặt một số tùy chọn regex để có được chính xác những gì bạn muốn cho chúng.

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