2009-07-12 6 views
6

Streifen sagen, dass ich Daten wie dieses:Wie kann ich Daten von HTML-Tags

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

PHP, wie würde ich irgendwie durch die HTML-Tags, den gesamten Text innerhalb der Optionswerte zurück. Zum Beispiel würde ich angesichts des obigen Codes gerne 'Test - 123', 'Test - 456', 'Test - 789' zurückgeben.

Danke für die Hilfe!

UPDATE: Damit ich bin mehr klar - ich bin mit filegetcontents(), um die html von einer Website zu bekommen. Für meine Zwecke möchte ich in der Lage sein, das HTML zu sortieren, die Optionswerte zu finden und sie auszugeben. Geben Sie in diesem Fall "Test - 123", "Test - 456" usw. zurück.

+0

Gibt es als ein Array zurück? –

Antwort

0

Wenn wir tun regex stuff, Ich mag diese Perl-ähnliche Syntax:

$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

Das Wertattribut eines Optionselementes ist als CDATA definiert. Wenn ich mich nicht täusche, erlaubt das

+0

Ja, das tut es :-) Mit regulären Ausdrücken ist es einfach, etwas Einfaches zu schreiben, das übliche Anwendungsfälle behandelt (und auch Ost zu lesen), aber es ist sehr schwer etwas zu schreiben, das eine strukturierte Sprache wie XML korrekt analysiert. Wenn Sie strikt "behandelt alles, was Sie werfen" Parser verwenden, verwenden Sie etwas, das die Sprache wie DOM oder SAX versteht. Der Nachteil ist, dass für einfache Fälle DOM und SAX schwerer zu schreiben und schwerer zu lesen sind. – Guss

0

Verwenden Sie strip_tags, es sei denn, ich missverstanden die Frage.

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

    $string = strip_tags($string); 

Update: verschossen, dass Sie lose ein Array in Frage angeben. In diesem Fall, und ich bin sicher, dass es eine saubere Methode, ich etwas tun würde:

$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: Und es nur nach oben und Schwanz, um es zu präsentieren, wie Sie ursprünglich gefragt (nicht ein Array, wie wir zu glauben, die Irre geführt worden sein, versuchen Sie folgendes:

$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

Dieser Code die Werte in ein Array laden würde, vorausgesetzt, Sie haben Zeilenumbrüche zwischen den Option-Tags wie Sie zeigte:

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

Es gibt viele Möglichkeiten, welche davon am besten ist, hängt von mehr Details ab, als Sie in Ihrer Frage angegeben haben.
Eine Möglichkeit: 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"; 
} 

druckt

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

Wenn Sie wie die erwähnte nicht nur ein Bruch haben, einen echten Parser wie DOMDocument verwenden, die Sie mit DOMXPath zu Fuß durch kann.

versuchen Ansonsten diesem regulären Ausdruck zusammen mit preg_match_all:

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