2016-11-03 18 views
5

Tôi cần trợ giúp. Những gì tôi muốn là làm cho bỏ qua một dấu phẩy trong chuỗi cụ thể. Đó là một tệp csv tách biệt bằng dấu phẩy, nhưng tên có dấu phẩy và tôi cần bỏ qua điều đó.php preg_split bỏ qua dấu phẩy trong chuỗi cụ thể

Những gì tôi nhận được là

<?php 
    $pattern = '/([\\W,\\s]+Inc.])|[,]/'; 
    $subject = 'hypertext language, programming, Amazon, Inc., 100'; 
    $limit = -1; 
    $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE; 
    $result = preg_split ($pattern, $subject, $limit, $flags); 
    ?> 

Kết quả là

$result (php code): 

<?php 
array (
    0 => 'hypertext language', 
    1 => ' programming', 
    2 => ' Amazon', 
    3 => ' Inc.', 
    4 => ' 100', 
); 
?> 

Và tôi muốn kết quả là

$result (php code): 

    <?php 
    array (
     0 => 'hypertext language', 
     1 => ' programming', 
     2 => ' Amazon, Inc.', 
     3 => ' 100', 
    ); 
    ?> 

Nhờ sự giúp đỡ của bạn :)

+1

quy tắc mà bạn muốn áp dụng ở đây là gì? Khớp một ',' không được theo sau với 'Inc.'? Giống như ['/,(?!\s*Inc\.)/'](https://regex101.com/r/iZlamw/1)? –

+0

Cảm ơn nó hoạt động :) –

+0

'str_getcsv', giả sử dòng của bạn đã được định dạng là CSV. – Progrock

Trả lời

3

Lưu ý rằng [\W,\s] = \W từ \W khớp với bất kỳ ký tự nào không phải là chữ cái, chữ số hoặc dấu gạch dưới. Tuy nhiên, có vẻ như bạn chỉ muốn chia nhỏ trên một số , mà không được theo sau với (các) không gian * + Inc..

Bạn có thể sử dụng một negative lookahead để đạt được điều này:

/,(?!\s*Inc\.)/ 
    ^^^^^^^^^^^^ 

Xem regex demo

Các (?!\s*Inc\.) sẽ thất bại bất kỳ trận đấu , nếu có 0+ khoảng trắng (\s*) theo sau với một chuỗi các ký tự chữ Inc. sau họ.

1

Từ hướng dẫn của bạn, nếu tôi kéo thông tin Amazon dưới dạng CSV, tôi sẽ nhận được định dạng sau. Sau đó bạn có thể phân tích cú pháp bằng một trong các hàm gốc của Php. Điều này cho thấy bạn không cần phải sử dụng phát nổ hoặc regex để xử lý dữ liệu này. Sử dụng các công cụ thích hợp cho công việc:

<?php 
$csv =<<<CSV 
"amzn","Amazon.com, Inc.",765.56,"11/2/2016","4:00pm","-19.85 - -2.53%",10985 
CSV; 

$array = str_getcsv($csv); 

var_dump($array); 

Output:

array (size=7) 
    0 => string 'amzn' (length=4) 
    1 => string 'Amazon.com, Inc.' (length=16) 
    2 => string '765.56' (length=6) 
    3 => string '11/2/2016' (length=9) 
    4 => string '4:00pm' (length=6) 
    5 => string '-19.85 - -2.53%' (length=15) 
    6 => string '10985' (length=5) 
Các vấn đề liên quan