2009-07-12 11 views
6

Say mam danych tak:Jak strip danych z tagów HTML

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

Używając PHP, jak bym sortowania tagów HTML, wracając cały tekst z ciągu wartości opcji. Na przykład, biorąc pod uwagę powyższy kod, chciałbym zwrócić "Test - 123", "Test - 456", "Test - 789".

Dzięki za pomoc!

UPDATE: Tak, że jestem bardziej jasne - Używam filegetcontents(), aby uzyskać HTML witryny. Dla moich celów chciałbym móc sortować html, znajdować wartości opcji i wyprowadzać je. W takim przypadku zwróć "Test - 123", "Test - 456", itp.

+0

Zwrócić go jako tablicę? –

Odpowiedz

0

Jeśli robimy regex rzeczy, lubię to jak Perl składnię:

$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

atrybut value elementu opcji jest zdefiniowany jako CDATA. Jeśli się nie mylę, pozwala to na

+0

Tak, robi to :-) W wyrażeniach regularnych łatwo jest napisać coś prostego, który obsługuje typowe przypadki użycia (a także wschód do czytania), ale bardzo trudno jest napisać coś, co poprawnie analizuje język strukturalny, taki jak XML. Jeśli potrzebujesz ścisłego "obsługo cokolwiek rzucasz na niego", użyj czegoś, co rozumie język taki jak DOM lub SAX. Minusem jest to, że w przypadku prostych przypadków DOM i SAX są trudniejsze do napisania i trudniejsze do odczytania. – Guss

0

Używanie strip_tags, chyba że nie rozumiem tego pytania.

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

    $string = strip_tags($string); 

Aktualizacja: Niewykorzystany że luźno określić tablicę w swoim pytaniu. W tym przypadku, a jestem pewien, że jest czystszy sposób, bym zrobił coś takiego:

$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); 

UPDATE 2: I właśnie do góry i ogon go, aby ją przedstawić jak pierwotnie zadawane (nie tablicą jak może zostali wprowadzeni w błąd, aby sądzić, spróbuj wykonać następujące czynności:

$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

Ten kod będzie załadować wartości do tablicy, zakładając, że masz linia łamie się pomiędzy znacznikami opcji jak pokazałeś:

// 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

Istnieje wiele sposobów, które są najlepsze, zależy od większej ilości szczegółów niż podane w pytaniu.
Jedną z możliwości: 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"; 
} 

drukuje

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

Jeśli nie właśnie złamanie jak te wymienione, użyj prawdziwe parser jak DOMDocument że można przejść przez z DOMXPath.

przeciwnym razie spróbuj tego wyrażenia regularnego wraz z preg_match_all:

<option(?:[^>"']+|"[^"]*"|'[^']*')*>([^<]+)</option>