2014-01-02 3 views
0

У меня есть полный html-файл в переменной PHP .. и хотел бы извлечь первые 3 значения в html, которые отформатированы как таковые q? S = XXX ИЛИ q? S = XX или q? S = XXXX (где X - символ запаса).Regex extract first 3 экземпляра соответствия из HTML с PHP

переменная $ HTML содержит:

<a name='mkt-movers' class='anchor'><\/a><h2 class='Fz-l Fw-200 Mend-4 D-i'>Market Movers<\/h2><\/div><div class=\"bd\">\t<div class=\"dropdown rapid-nf Fw-200 Bdrs\">\n   <form class=\"SelectBox SelectBoxNoBorder\">\n    <div class=\"SelectBox-Pick\">\n     <span class=\"SelectBox-Text\">U.S. Composite<\/span>\n\t\t <i class='Icon'>&#xe002;<\/i>\n    <\/div>\n\n    <select data-plugin=\"selectbox\" class='Start-0' name='selectBox' >\n\t\t <option value=\"0\" selected=\"selected\" class=\"Selected\">U.S. Composite<\/option><option value=\"1\" >Nasdaq<\/option><option value=\"2\" >NYSE Market<\/option><option value=\"3\" >NYSE<\/option>\n    <\/select>\n    <noscript>\n     <Btn type=\"submit\" class=\"Hidden\">Select<\/Btn>\n    <\/noscript>\n   <\/form>\n\t<\/div><div class=\"content\"><div class=\"mod-85ac7b2b-640f-323f-a1c1-00b2f4865d18 mod active\"><div id=\"mod_85ac7b2b_640f_323f_a1c1_00b2f4865d18\" class=\"yom-mod yom-app yom-data yfi-table wp yfi-mmovers fin-glass-disabled\">\n\t<a name=\"mkt-movers\" class=\"anchor\"><\/a>\n <div class=\"hd\">\n  <h2 class=\"Fw-200 Fz-l M-0\"><\/h2>\n <\/div>\n <div class=\"bd yom-tabview\">\n   <ul role=\"tablist\" data-plugin='tabpanel' class='FinTabs Mb-10'>\n    <li class=\"Grid-U Mend-8 FinTab-Item Selected rmp-0\" role=\"presentation\">\n     <a href=\"#mod_85ac7b2b_640f_323f_a1c1_00b2f4865d18-tab1\" role = \"tab\" class = \"FinTab-Label no-pjax\" data-tabpanel-target = \"#mod_85ac7b2b_640f_323f_a1c1_00b2f4865d18-tab1\" >Most Actives<\/a>\n    <\/li>\n    <li class=\"Grid-U Mend-8 FinTab-Item rmp-0\" role=\"presentation\">\n     <a href=\"#mod_85ac7b2b_640f_323f_a1c1_00b2f4865d18-tab2\" role = \"tab\" class = \"FinTab-Label no-pjax\" data-tabpanel-target = \"#mod_85ac7b2b_640f_323f_a1c1_00b2f4865d18-tab2\" >% Gainers<\/a>\n    <\/li>\n    <li class=\"Grid-U Mend-8 FinTab-Item rmp-0\" role=\"presentation\">\n     <a href=\"#mod_85ac7b2b_640f_323f_a1c1_00b2f4865d18-tab3\" role = \"tab\" class = \"FinTab-Label no-pjax\" data-tabpanel-target = \"#mod_85ac7b2b_640f_323f_a1c1_00b2f4865d18-tab3\" >% Losers<\/a>\n    <\/li>\n   <\/ul>\n\t<div class=\"yfi-panelcontainer yui3-tabview-panel\">\n   <div role=\"tabpanel\" id=\"mod_85ac7b2b_640f_323f_a1c1_00b2f4865d18-tab1\" class=\" Selected\" data-start=\"0\" data-count=\"10\" data-content=\"mostactive\" >\n  \t<div class=\"original\">\n    \n  <table summary=\"1\" class=\"yom-data col-8 phatable\" >\n   <caption><\/caption>\n   <colgroup><col><col><col><col><col><col><col><col><\/colgroup>\n   <thead>\n   <tr>\n    <th id=\"table-31-0-0\" class=\"symbol txt-color\" scope=\"col\"><span>Symbol<\/span><\/th>\n    <th id=\"table-31-0-1\" class=\"name txt-color\" scope=\"col\"><span>Company Name<\/span><\/th>\n   

Я хочу, чтобы извлечь первые 3 символы акций в большой полный HTML строку выше. То есть output = "BAC", "GE", "MSFT".

Примечание - символы запаса могут быть длиной 1, 2, 3 или 4 символа.

Любые идеи, чтобы получить это, были бы оценены - спасибо!

ответ

1

Это должно работать, попробуйте:

if(preg_match_all('~(?<=q\?s=)[-A-Z.]{1,5}~', $source, $out)) 
{ 
    // The matches are in [0] (whole pattern) 
    echo "<pre>"; print_r($out[0]); echo "</pre>"; 

    // If you need first 3 
    #$out[0] = array_slice($out[0],0,3); 
    #echo "<pre>"; print_r($out[0]); echo "</pre>"; 

    // If you need them unique: 
    $out[0] = array_unique($out[0]); 
    echo "<pre>"; print_r($out[0]); echo "</pre>"; 

} else { 
    echo "FAIL"; 
} 

Я изменил шаблон немного, чтобы соответствовать символы акций like in this list к ~(?<=q\?s=)[-A-Z.]{1,5}~

  • Это looks behind для q?=
  • Если найдено, соответствует 1-5 символов: A-Z, ., -
+0

Отлично .. это работает очень хорошо! Спасибо. – ChicagoDude

+0

@ChicagoDude Happy it works for you! –

1

Это должно быть сделано.

preg_match_all("/q\?s=([A-Za-z\.]{1,5})/",$html,$matches); 

for ($i = 1; $i <= 3; $i++) { 
    if (isset($matches[$i])) { 
     echo $i; 
    } 
} 

Это будет соответствовать всем в вашей строке html. Вам нужно выполнить цикл от 1 до 3, чтобы получить совпадения. Примечание: совпадения, отмеченные скобкой, начинаются с $matches[1]. $matches[0] будет содержать текст, соответствующий всем шаблонам.

Вот документация о preg_match: http://us2.php.net/preg_match

+0

нужно преобразовать в preg_match_all – Rottingham

+0

Ответ был обновлен. – Robbert

+0

Спасибо, но он не работал :(Значения, которые я получаю для совпадений, равны 1, NULL. Также - я обновил свой пост выше с фактическим содержимым переменной PHP, если это помогает диагностировать проблему. – ChicagoDude

Смежные вопросы