2015-04-22 13 views
5

bắt đầu. Tôi có vấn đề sử dụng regexp expresion trong hàm sau php:regexp để phân tích xml thành mảng

$xml1 = "<arg1> 
     <S113-03>1</S113-03> 
     <S184-06>1</S184-06> 
    </arg1>"; 

$xml2 = "<arg1> 
     <P055>1</P055> 
     <P096>1</P096> 
    </arg1>"; 

function xml2array($xml) { 
    $xmlArray = array(); 
    $regexp = "/<(\w+)\s*([^\/>]*)\s*(?:\/>|>(.*)<\/\s*\\1\s*>)/s"; 
    preg_match_all($regexp, $xml, $elements); 

    foreach ($elements[1] as $ie => $element) { 
     if (preg_match($regexp, $elements[3][$ie])) 
      $xmlArray[$element] = xml2array($elements[3][$ie]); 
     else { 
      $xmlArray[$element] = trim($elements[3][$ie]); 
     } 
    } 
return $xmlArray; 
} 

$array = xml2array($xml1); 
echo print_r($array, true); 

trong khi $ XML2 mang lại cho tôi kết quả (nó là OK):

Array 
(
    [arg1] => Array 
     (
      [P055] => 1 
      [P096] => 1 
     ) 

) 

trong khi $ xml1 mang lại cho tôi kết quả (sai):

Array 
(
    [arg1] => <S113-03>1</S113-03> 
      <S184-06>1</S184-06> 
) 

tôi tin rằng vấn đề là ở regexp, nhưng nội dung của nó có vẻ là trà Trung Quốc về cho tôi

+1

Không sử dụng regex. Có câu trả lời cho bạn lựa chọn tốt hơn ... đó là [phong phú] (http://php.net/manual/en/refs.xml.php). – tmt

+0

Xin cảm ơn tất cả. Trong thực tế, chức năng là một phần của một giao diện nhập khẩu chứng khoán trong Magento và tôi đã không chắc chắn để thay thế regexp ban đầu với SimpleXMLElement vì tôi không hiểu lý do sử dụng regexp ở đó. dù sao cảm ơn cho cả hai lựa chọn thay thế. – sorrex

Trả lời

2

Sử dụng sửa chữa này, lưu ý các cập nhật (\w+) mà bây giờ là ([\w-]+):

$regexp = "/<([\w-]+)\s*([^\/>]*)\s*(?:\/>|>(.*)<\/\s*\\1\s*>)/s"; 

Kết quả là

Array                                                             
(                                                              
    [arg1] => Array                                                          
     (                                                            
      [S113-03] => 1                                                        
      [S184-06] => 1                                                        
     )                                                            

) 

Đây là 01.239..

+1

@Downvoter: Điều gì là sai với sửa chữa regex? Khi bạn downvote một giải pháp làm việc, bạn sẽ kết thúc với không có đại diện ở tất cả sớm hay muộn. –

+3

Tôi hiểu mọi người không thích cách tiếp cận regex khi họ nhìn thấy văn bản phong phú, nhưng tôi chỉ đề nghị sửa chữa mã hiện tại. Tôi không áp đặt một giải pháp regex cho bất cứ ai. –

4

Yo bạn biết Chuck Norris?

Chuck Norris có thể phân tích cú pháp HTML bằng RegExp.

Dù sao đây với đi mà không RegExp:

Demo

<?php 

$xml1 = "<arg1> 
     <S113-03>1</S113-03> 
     <S184-06>1</S184-06> 
    </arg1>"; 

$xml2 = "<arg1> 
     <P055>1</P055> 
     <P096>1</P096> 
    </arg1>"; 

function xml2array($xmlString) 
{ 
    $xml = simplexml_load_string($xmlString, 'SimpleXMLElement', LIBXML_NOCDATA); 
    return json_decode(json_encode((array)$xml), TRUE); 
} 

var_dump(xml2array($xml1)); 
var_dump(xml2array($xml2)); 

Output:

array(2) { 
    ["S113-03"]=> 
    string(1) "1" 
    ["S184-06"]=> 
    string(1) "1" 
} 
array(2) { 
    ["P055"]=> 
    string(1) "1" 
    ["P096"]=> 
    string(1) "1" 
} 
+1

đã đồng ý. chuck norris có thể phân tích cú pháp html/xml với regex, childs play – Ghost

+1

điểm là, * only * chuck norris có thể kéo nó đi. * Mọi người khác * nên tránh xa regexp để phân tích cú pháp xml/html – tucuxi

+1

@tucuxi: Tôi nghi ngờ Chuck Norris hiểu từ "thẻ". Tôi có thể sử dụng regexes, tôi có thể (?: Đọc | viết) chúng. Nếu tôi cần phải phân tích một chuỗi đơn giản.? (? = ML) từ một nguồn đã biết, tôi sẽ tìm nó! –

2

Nó sẽ dễ dàng hơn và nhanh hơn (nhiều bộ nhớ-khôn ngoan) để sử dụng PHP SimpleXML chức năng .

$xml1 = "<arg1> 
     <S113-03>1</S113-03> 
     <S184-06>2</S184-06> 
    </arg1>"; 

$xml2 = "<arg1> 
     <P055>3</P055> 
     <P096>4</P096> 
    </arg1>"; 

var_dump(new \SimpleXMLElement($xml1)); 
var_dump(new \SimpleXMLElement($xml2)); 

bãi:

php test.php 
class SimpleXMLElement#1 (2) { 
    public $S113-03 => 
    string(1) "1" 
    public $S184-06 => 
    string(1) "2" 
} 
class SimpleXMLElement#1 (2) { 
    public $P055 => 
    string(1) "3" 
    public $P096 => 
    string(1) "4" 
}