2011-06-19 6 views
0

J'ai un bloc HTML comme celui-ciphp, obtenir entre les balises html, regex

<option value="berkshire">Berkshire             
<option value="reading">Reading</option></optgroup> 
<option value="buckinghamshire">Buckinghamshire 
<option value="milton-keynes">Milton Keynes</option></optgroup> 
<option value="east-sussex">East Sussex<option value="brighton">Brighton</option> </optgroup> 

Et je dois extraire la valeur et le nom (par exemple, valeur = berkshire, name = Berkshire

Jusqu'à présent, je « ai essayé deux méthodes: 1.

 
function get_between($content,$start,$end){ 
    $r = explode($start, $content); 
    if (isset($r[1])){ 
     $r = explode($end, $r[1]); 
     return $r[0]; 
    } 
    return ''; 
} 


    $value = get_between($htmlContent, 'value="', '">'); 
    $name = get_between($htmlContent, "$value\">", ''); 

le problème est qu'il ne reçoit que la première valeur de nom (berkshire et Berkshire) Si je fais $ r [1] dymanic et réglez $ r. [2], $ r [4], etc. avec while ou foreach je reçois seulement la valeur et le nom n'est plus retourné pour certaines raisons que je ne comprends pas.

2.Regex J'ai essayé d'extraire au moins la "valeur" mais je n'ai pas pu obtenir la regex correcte donc pour le "nom" je n'avais même pas de point de départ.

 
    $pattern = "//"; 
preg_match_all($pattern,$htmlContent, $matches); 
print_r($matches); 

Toute aide serait appréciée.

Répondre

0

Si votre bloc HTML est compatible, vous pouvez bien sûr utiliser simple regex pour extraction:

preg_match_all('#<option\s+value="([^"]+)">([^<]*)#i') 
// requires to strip trailing whitespace from the name in $matches[2] 

Mais si vous voulez récupérer effectivement le contenu de HTML dans le monde réel, alors il est plus facile d'utiliser un DOM comme analyseur phpQuery ou QueryPath pour la simplicité:

foreach (qp($html)->find("option") as $opt) { 
    echo $name = $opt->text(), $opt->attr("value"); 
} 
0

Il obtient seulement la première valeur de nom parce que vous n'avez pas tenté de diviser entre les options. Voici ma solution pour votre problème (pas regex). Ces lignes vont après la fonction get_between():

$opt = explode('<option ', $html); 
foreach ($opt as $split_html) { 
    $value = get_between($split_html, 'value="', '">'); 
    $name = get_between($split_html, "$value\">", ' '); 
    echo $value ." ". $name . "<br />"; 
} 
0

peut être fait en utilisant DomDocument pour normaliser l'entrée HTML et XPath pour obtenir les valeurs qui vous intéressent:

$results = array(); 
$dom = new DOMDocument; 
@$dom->loadHTML($html); 
$xpath = new DomXpath($dom); 
foreach($xpath->query('//option[@value]') as $node) { 
    $results[] = array(
     'value' => $node->getAttribute('value'), 
     'name' => trim($node->nodeValue) 
    ); 
} 
var_dump($results); 

Si vous supprimez la @ en face de la troisième ligne, vous verrez les erreurs dans le bloc HTML.

Questions connexes