2009-07-12 34 views
6

Nói rằng tôi có dữ liệu như thế này:Làm thế nào để dải dữ liệu từ thẻ HTML

<option value="abc" >Test - 123</option> 
<option value="def" >Test - 456</option> 
<option value="ghi" >Test - 789</option> 

Sử dụng PHP, sẽ như thế nào tôi sắp xếp thông qua các thẻ HTML, trả lại tất cả văn bản từ bên trong các giá trị tùy chọn. Ví dụ, với đoạn mã trên, tôi muốn trả về 'Test - 123', 'Test - 456', 'Test - 789'.

Cảm ơn sự giúp đỡ!

CẬP NHẬT: Vì vậy, tôi rõ ràng hơn - Tôi đang sử dụng filegetcontents() để lấy html từ một trang web. Vì mục đích của tôi, tôi muốn có thể sắp xếp thông qua html, tìm các giá trị tùy chọn và xuất chúng. Trong trường hợp này, hãy trả lại 'Kiểm tra - 123', 'Thử nghiệm - 456', v.v.

+0

Trả về nó như một mảng? –

Trả lời

0

Nếu chúng ta đang làm công cụ regex, tôi thích perl giống như cú pháp sau:

$test = "<option value=\"abc\" >Test - 123</option>\n" . 
    "<option value=\"abc\" >Test - 456</option>\n" . 
    "<option value=\"abc\" >Test - 789</option>\n"; 

for ($offset=0; preg_match("/<option[^>]*>([^<]+)/",$test, $matches, 
         PREG_OFFSET_CAPTURE, $offset); $offset=$matches[1][1]) 
    print($matches[1][0] . "\n");' 
+4

thuộc tính giá trị của phần tử tùy chọn được định nghĩa là CDATA. Nếu tôi không nhầm lẫn, cho phép

+0

Vâng, nó có :-) Với các biểu thức chính quy, nó dễ dàng viết một cái gì đó đơn giản để xử lý các trường hợp sử dụng phổ biến (và cả phía đông để đọc), nhưng rất khó để viết một cái gì đó phân tích ngôn ngữ có cấu trúc như XML một cách chính xác. Nếu bạn cần trình phân tích cú pháp "xử lý mọi thứ bạn ném" nghiêm ngặt, hãy sử dụng thứ gì đó hiểu ngôn ngữ như DOM hoặc SAX. Nhược điểm là ở chỗ các trường hợp đơn giản DOM và SAX khó viết và khó đọc hơn. – Guss

0

Sử dụng strip_tags trừ khi tôi hiểu nhầm câu hỏi.

$string = '<option value="abc" >Test - 123</option> 
    <option value="def" >Test - 456</option> 
    <option value="ghi" >Test - 789</option>'; 

    $string = strip_tags($string); 

Cập nhật: nhỡ mà bạn lỏng lẻo chỉ định một mảng trong câu hỏi của bạn. Trong trường hợp này, và tôi chắc chắn rằng có một phương pháp sạch hơn, tôi muốn làm một cái gì đó như:

$teststring = '<option value="abc" >Test - 123</option> 
<option value="def" >Test - 456</option> 
<option value="ghi" >Test - 789</option>'; 

$stringarray = split("\n", strip_tags($teststring)); 
print_r($stringarray); 

Cập nhật 2: Và chỉ để đầu và đuôi nó, để trình bày nó như bạn ban đầu hỏi (không một mảng như chúng ta có thể đã bị lừa để tin, hãy thử như sau:

$teststring = '<option value="abc" >Test - 123</option> 
<option value="def" >Test - 456</option> 
<option value="ghi" >Test - 789</option>'; 

$stringarray = split("\n", strip_tags($teststring)); 

$newstring = join($stringarray, "','"); 
echo "'" . $newstring . "'\n"; 
1

mã này sẽ nạp giá trị vào một mảng, giả sử bạn có ngắt dòng ở giữa các thẻ tùy chọn như bạn thấy:

// Load your HTML into a string. 
$html = <<<EOF 
<option value="abc" >Test - 123</option> 
<option value="def" >Test - 456</option> 
<option value="ghi" >Test - 789</option> 
EOF; 

// Break the values into an array. 
$vals = explode("\n", strip_tags($html)); 
3

Có nhiều cách, cái nào tốt nhất phụ thuộc vào nhiều chi tiết hơn bạn đã cung cấp trong câu hỏi của mình.
Một khả năng: DOMDocument and DOMXPath

<?php 
$doc = new DOMDocument; 
$doc->loadhtml('<html><head><title>???</title></head><body> 
    <form method="post" action="?" id="form1"> 
     <div> 
     <select name="foo"> 
     <option value="abc" >Test - 123</option> 
     <option value="def" >Test - 456</option> 
     <option value="ghi" >Test - 789</option> 
     </select> 
    </div> 
    </form> 
</body></html>'); 

$xpath = new DOMXPath($doc); 
foreach($xpath->query('//form[@id="form1"]//option') as $o) { 
    echo 'option text: ', $o->nodeValue, " \n"; 
} 

in

option text: Test - 123 
option text: Test - 456 
option text: Test - 789 
1

Nếu bạn đã không chỉ là một gãy xương như một đề cập, sử dụng một cú pháp thực như DOMDocument mà bạn có thể đi bộ qua với DOMXPath.

Nếu không cố gắng biểu thức chính quy này cùng với preg_match_all:

<option(?:[^>"']+|"[^"]*"|'[^']*')*>([^<]+)</option> 
Các vấn đề liên quan