-
regex Hilfe
Moin, ich bräuchte mal eure Hilfe bzw. einen Denkanstoss.
hab folgende HTML Daten vorliegen
HTML-Code:
<select id="ent_language" name="sea_language">
<option value="1">Deutsch</option>
<option value="2">Englisch</option>
<option value="4">Chinesisch</option>
<option value="5">Spanisch</option>
<option value="6">Französisch</option>
<option value="7">Türkisch</option>
<option value="8">Japanisch</option>
<option value="11">Italienisch</option>
<option value="15">Deutsch / Englisch</option>
<option value="16">Niederländisch</option>
<option value="9">Arabisch</option>
<option value="12">Kroatisch</option>
<option value="13">Serbisch</option>
<option value="14">Bosnisch</option>
<option value="17">Koreanisch</option>
<option value="24">Griechisch</option>
<option value="25">Russisch</option>
<option value="26">Indisch</option>
</select>
<select id="sub_language" name="subs_language">
<option value="11">Deutsch</option>
<option value="21">Englisch</option>
<option value="41">Chinesisch</option>
<option value="51">Spanisch</option>
<option value="61">Französisch</option>
<option value="71">Türkisch</option>
<option value="81">Japanisch</option>
<option value="111">Italienisch</option>
<option value="151">Deutsch / Englisch</option>
<option value="161">Niederländisch</option>
<option value="91">Arabisch</option>
<option value="121">Kroatisch</option>
<option value="131">Serbisch</option>
<option value="141">Bosnisch</option>
<option value="171">Koreanisch</option>
<option value="241">Griechisch</option>
<option value="251">Russisch</option>
<option value="261">Indisch</option>
</select>
Daraus will ich nun ein Array mit der Sprache und zugehöriger ID haben.
Ich benötige nir due Daten aus dem ersten Select. Das zweite soll ignoriert werden.
Da ich mit Regex gern mal spinnefeind bin hab ich bisher nur folgendes erfolglos probiert
PHP-Code:
preg_match('!Sprache.*<option value="(.*)">(.*)</option>!isUm', $html, $matches)
preg_match_all("/<option value=\"(.*)\">(.*)<\/span>/is",$html,$matches);
Beides gibt mir nicht das gewünschte Ergebniss oder Daten mit denen man Arbeiten kann.
Danke schonmal im vorraus
-
HTML mit RegEx parsen ist immer so eine Sache. Man sollte einen HTML-Parser (oder etwas vergleichbares) verwenden und nicht RegEx, sobald es über einfache Dinge hinausgeht.
Ein einfach Ansatz wäre, dass du zuerst das erste Select per RegEx herausfilterst und das Ergebnis dann ganz normal erneut mit RegEx durchsuchst.
-
Das was Nimbus sagt +:
PHP-Code:
$start = stripos($html, '<select id="ent_language"');
$end = stripos($html, '</select>', $start);
preg_match_all('#<option value="(\d+)">([^<]+)</option>#i', substr($html, $start, $end - $start), $matches, PREG_SET_ORDER);
print_r($matches);
-
Geht sehr wohl und sogar relativ easy.
PHP-Code:
<?php
$htmlInput = <<<EOF
<select id="ent_language" name="sea_language">
<option value="1">Deutsch</option>
<option value="2">Englisch</option>
<option value="4">Chinesisch</option>
<option value="5">Spanisch</option>
<option value="6">Französisch</option>
<option value="7">Türkisch</option>
<option value="8">Japanisch</option>
<option value="11">Italienisch</option>
<option value="15">Deutsch / Englisch</option>
<option value="16">Niederländisch</option>
<option value="9">Arabisch</option>
<option value="12">Kroatisch</option>
<option value="13">Serbisch</option>
<option value="14">Bosnisch</option>
<option value="17">Koreanisch</option>
<option value="24">Griechisch</option>
<option value="25">Russisch</option>
<option value="26">Indisch</option>
</select>
<select id="sub_language" name="subs_language">
<option value="11">Deutsch</option>
<option value="21">Englisch</option>
<option value="41">Chinesisch</option>
<option value="51">Spanisch</option>
<option value="61">Französisch</option>
<option value="71">Türkisch</option>
<option value="81">Japanisch</option>
<option value="111">Italienisch</option>
<option value="151">Deutsch / Englisch</option>
<option value="161">Niederländisch</option>
<option value="91">Arabisch</option>
<option value="121">Kroatisch</option>
<option value="131">Serbisch</option>
<option value="141">Bosnisch</option>
<option value="171">Koreanisch</option>
<option value="241">Griechisch</option>
<option value="251">Russisch</option>
<option value="261">Indisch</option>
</select>
EOF;
$document = new DOMDocument();
$document->loadHTML($htmlInput);
$documentData = $document->getElementsByTagName('option');
$array = array();
foreach ($documentData as $htmlRecord) {
$array[$htmlRecord->getAttribute('value')] = $htmlRecord->nodeValue;
}
Ergebnis:
Code:
array(35) {
[1]=>
string(7) "Deutsch"
[2]=>
string(8) "Englisch"
[4]=>
string(10) "Chinesisch"
[5]=>
string(8) "Spanisch"
[6]=>
string(14) "Französisch"
[7]=>
string(11) "Türkisch"
[8]=>
string(9) "Japanisch"
[11]=>
string(7) "Deutsch"
[15]=>
string(18) "Deutsch / Englisch"
[16]=>
string(17) "Niederländisch"
[9]=>
string(8) "Arabisch"
[12]=>
string(9) "Kroatisch"
[13]=>
string(8) "Serbisch"
[14]=>
string(8) "Bosnisch"
[17]=>
string(10) "Koreanisch"
[24]=>
string(10) "Griechisch"
[25]=>
string(8) "Russisch"
[26]=>
string(7) "Indisch"
[21]=>
string(8) "Englisch"
[41]=>
string(10) "Chinesisch"
[51]=>
string(8) "Spanisch"
[61]=>
string(14) "Französisch"
[71]=>
string(11) "Türkisch"
[81]=>
string(9) "Japanisch"
[111]=>
string(11) "Italienisch"
[151]=>
string(18) "Deutsch / Englisch"
[161]=>
string(17) "Niederländisch"
[91]=>
string(8) "Arabisch"
[121]=>
string(9) "Kroatisch"
[131]=>
string(8) "Serbisch"
[141]=>
string(8) "Bosnisch"
[171]=>
string(10) "Koreanisch"
[241]=>
string(10) "Griechisch"
[251]=>
string(8) "Russisch"
[261]=>
string(7) "Indisch"
}
So ist die ID der Schlüssel und die Sprache der Wert des Schlüssels, um dies zu ändern musst du in der foreach-Schleife folgendes ändern:
PHP-Code:
$array[$htmlRecord->getAttribute('value')] = $htmlRecord->nodeValue;
zu
PHP-Code:
$array[$htmlRecord->nodeValue] = $htmlRecord->getAttribute('value');
-
Wer hat denn etwas anderes behauptet?
EDIT: EVXN dein Code liefert nicht das Ergebnis. Der zweite select-Tag soll ja eben ignoriert werden, auch wenn die Anpassung trivial sein dürfte.
-
Auch kein Problem:
PHP-Code:
<?php
$htmlInput = '<select id="ent_language" name="sea_language">
<option value="1">Deutsch</option>
<option value="2">Englisch</option>
<option value="4">Chinesisch</option>
<option value="5">Spanisch</option>
<option value="6">Französisch</option>
<option value="7">Türkisch</option>
<option value="8">Japanisch</option>
<option value="11">Italienisch</option>
<option value="15">Deutsch / Englisch</option>
<option value="16">Niederländisch</option>
<option value="9">Arabisch</option>
<option value="12">Kroatisch</option>
<option value="13">Serbisch</option>
<option value="14">Bosnisch</option>
<option value="17">Koreanisch</option>
<option value="24">Griechisch</option>
<option value="25">Russisch</option>
<option value="26">Indisch</option>
</select>
<select id="sub_language" name="subs_language">
<option value="11">Deutsch</option>
<option value="21">Englisch</option>
<option value="41">Chinesisch</option>
<option value="51">Spanisch</option>
<option value="61">Französisch</option>
<option value="71">Türkisch</option>
<option value="81">Japanisch</option>
<option value="111">Italienisch</option>
<option value="151">Deutsch / Englisch</option>
<option value="161">Niederländisch</option>
<option value="91">Arabisch</option>
<option value="121">Kroatisch</option>
<option value="131">Serbisch</option>
<option value="141">Bosnisch</option>
<option value="171">Koreanisch</option>
<option value="241">Griechisch</option>
<option value="251">Russisch</option>
<option value="261">Indisch</option>
</select>
';
$document = new DOMDocument();
$document->loadHTML($htmlInput);
$document = $document->getElementById('ent_language');
$documentData = $document->getElementsByTagName('option');
$array = array();
foreach ($documentData as $htmlRecord) {
$array[$htmlRecord->getAttribute('value')] = $htmlRecord->nodeValue;
}
-
Mit dem DOMDocument hat es ziemlich gut funktioniert aber letztendlich hab ich mich für die rudimentäre Methode entschieden da mir die andere einige Warnings ausgeworfen hat welche ich nicht erst aufwendig entfernen wollte.
Aktuelle Lösung ist somit diese hier
PHP-Code:
$start = stripos($html, '<select id="ent_language"');
$end = stripos($html, '</select>', $start);
if(preg_match_all('#<option value="(\d+)">([^<]+)</option>#isUm', substr($html, $start, $end - $start), $matches))
{
return array_combine($matches[2], $matches[1]));
}
Ergebniss
HTML-Code:
Array
(
[Deutsch] => 1
[Englisch] => 2
[Chinesisch] => 4
[Spanisch] => 5
[Französisch] => 6
[Türkisch] => 7
[Japanisch] => 8
[Italienisch] => 11
[Deutsch / Englisch] => 15
[Niederländisch] => 16
[Arabisch] => 9
[Kroatisch] => 12
[Serbisch] => 13
[Bosnisch] => 14
[Koreanisch] => 17
[Griechisch] => 24
[Russisch] => 25
[Indisch] => 26
)
Danke an die helfenden Hände hier im Thread und die Leute welche mir privat geschrieben haben <3