Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyłuskanie danych ze strony
Forum PHP.pl > Forum > PHP
porady-it.pl
Witam,

Chciałem prosić o pomoc przy napisaniu wyrażenia regularnego które wyłuskało by wszystkie input-y ze stringu. Napisałem coś takiego:

  1. <?php
  2. ereg("^<input.*>$",$result,$tab);
  3. ?>


Niestety działa to tylko gdy mam bardzo prosty przykład np.

  1. <?php
  2. $result = '<input type="text" name="www">';
  3. ?>
sunlifter
Cytat
Niestety działa to tylko gdy mam bardzo prosty przykład np.



<?php
$result = '<input type="text" name="www">';
?>


Co masz na myśli pisząc bardzo prosty przykład? Jakie 'inputy' byś chciał przetwarzać?


Może to pomoże winksmiley.jpg http://www.regextester.com/
porady-it.pl
Poniżej fragment kodu z którego chciałbym wyłuskać listę input-ów:

Kod
<form action="xxx" method="post" id="f1" autocomplete="OFF" onSubmit="return checkForm(f1)">
                  <input name="typ" type="hidden" value="10006">
                  <input name="inumer" type="hidden" value="1219263295638">
                  <input type="hidden" name="lang" value="pl">
                  <input type="hidden" name="loginOrigin" value="0">
                  <div class="left_margin">
                    <b>NIK:</b>
                        <input type="text" name="id" size="13" maxlength="12" class="content_center_input">
                        <script language="JavaScript" type="text/javascript">
                          document.forms["f1"].elements["id"].focus();
                        </script>
                  <table cellpadding="0" cellspacing="0" class="left_margin" style="font-family: Verdana; font-weight: bold; font-size: 11px; color:#FFFFFF">
                     <tr><td colspan="2"></td></tr>
                  </table>
                <div style="text-align: right; padding: 0 155px 0 0;"><input type="image" id="okBtn" src="/gif/shared/login/zaloguj_pl.gif" name="okButton" ></div>
                <table>
                  <tr>
                    <td>
                      <div style="padding: 0 0 0 5px;"><a href="javascript:void(0);" title=""><img src="/gif/shared/login/flag_en.gif" alt="" onclick="document.forms['f1'].elements['typ'].value=13;document.forms['f1'].elements['lang'].value='en';document.forms['f1'].submit();"></a></div>
                    </td>
                    <td width="100%">
                      <div style="padding: 0 5 0 0px; text-align: right; font-family: Verdana; font-size: 11px; font-weight: bold;"><a href="http://dlaciebie.bzwbk.pl/12481" target="_blank">Zobacz DEMO</a></div>
                    </td>
                  </tr>
                </table>
              </form>
pyro
  1. <?php
  2.  
  3. $preg = preg_match_all('|<input.*?>|im', $text, $tablica_inputow);
  4. // EDIT: poprawiłem przleamanie wiersza przez forum
  5. // $tablica inputow zawiera wszystkie inputy
  6. // print_r($tablica_inputow);
  7.  
  8. ?>
porady-it.pl
Rzeczywiście daje oczekiwane efekty smile.gif Bardzo dziękuję smile.gif Ale może uda się pujść krok dalej i w jakiś łatwy sposób uzyskać rozbicie input-a na dodatkową tablicę która zawierała by nazwę oraz wartość.

  1. <?php
  2. array(2) {
  3. [0] => array(2) {
  4. 'name' => 'id', 
  5. 'value' =>'test' }
  6. [1] => array(2) {
  7. 'name' => 'type', 
  8. 'value' => 1006}
  9. }
  10. ?>
pyro
sie zajmij tym sam smile.gif
bim2
Jeśli name będzie zawsze przed value to
  1. <?php
  2. $preg = preg_match_all('|<input.*?name="(.*?)".*?value="(.*?)">|im', $text, $tablica_inputow);
  3. ?>
pyro
bim2 twoj regex jest bledny
bim2
Dużo mi to nie mówi. Wyskakuje jakiś błąd w regexie, czy nic nie znajduje, a może znajduje tylko część?
pyro
nic z tych rzeczy, poprostu widać, że jest błędny tongue.gif

1. nie dałeś jeszcze pod uwagę type=""
2. w niektorych miejscach blednie .*?
franki01
Moje rozwiązanie jest chyba dość cienkie wydajnościowo, ale to jedyne co mi przychodzi do głowy:

  1. <?php
  2. preg_match_all('(<input(.*?)>)im', $text, $tablica_inputow);
  3. $inputs = array();
  4.  
  5. for($i = 0; $i < count($tablica_inputow[0]); $i++)
  6. {
  7. preg_match_all('( ([a-zA-Z]*)="(.*?)")im', $tablica_inputow[1][$i], $atrybuty);
  8. for($j = 0; $j < count($atrybuty[0]); $j++)
  9. {
  10. $inputs[$i][] = array($atrybuty[1][$j], $atrybuty[2][$j]);
  11. }
  12. }
  13. ?>


Po wykonaniu tego będziesz miał podobną tablicę $inputs jak wyżej napisałeś. Pisane z palca, aczkolwiek powinno działać.
bim2
Ehh, wydajniej:
  1. <?php
  2. preg_match_all('(<input(.*?)>)im', $text, $tablica_inputow);
  3. $inputs = array();
  4.  
  5. foreach($tablica_inputow[0] $i => $v)
  6. {
  7. preg_match_all('( ([a-zA-Z]*)="(.*?)")im', $tablica_inputow[1][$i], $atrybuty);
  8.  
  9. }
  10. print_r($atrybuty);
  11. ?>
franki01
Cytat(bim2 @ 21.08.2008, 15:07:13 ) *
Ehh, wydajniej:
  1. <?php
  2. preg_match_all('(<input(.*?)>)im', $text, $tablica_inputow);
  3. $inputs = array();
  4.  
  5. foreach($tablica_inputow[0] $i => $v)
  6. {
  7. preg_match_all('( ([a-zA-Z]*)="(.*?)")im', $tablica_inputow[1][$i], $atrybuty);
  8.  
  9. }
  10. print_r($atrybuty);
  11. ?>

Wcale nie. Błąd za błędem.

W moim kodzie akurat najwięcej wydajności traci się poprzez wielokrotne użycie preg_match_all. W Twoim wypadku tych wywołań jest tyle samo. Pętla foreach() była zawsze mniej wydajna od innych pętli - for() i while(). print_r($atrybuty); na końcu wyświetli tylko atrybuty z ostatniego inputa, a chyba chodzi o to, aby były wszystkie... To na pewno nie jest poprawnie. Tak samo Twój kod nie potrafi odczytać po kolei atrybutów, bo usunąłeś ważną część kodu - bez sensu.
pyro
po co wy cuda niewidy robicie, przecież to wszystko można w jednym regexie załatwic...
franki01
Cytat(pyro @ 21.08.2008, 16:11:36 ) *
po co wy cuda niewidy robicie, przecież to wszystko można w jednym regexie załatwic...

No to chętnie bym zobaczył takiego regexa, dla którego kolejność argumentów w tagu będzie nieważna.
pyro
a żeby ci kochanieńki łyso było.

  1. <?php
  2. $preg = preg_match_all('/<inputs+(?:type)|(?:name)|(?:value)s*=s*"|'w*"|'s+(?:type)|(?:name)|(?:value)s*=s*"|'w*"|'s+(?:type)|(?:name)|(?:value)s*=s*"|'w*"|'.*>/i', $text, $tablica_inputow);
  3. ?>


moglem gdzies zrobic blad, bo troszke dlugi regex, ale mniej wiecej powinien wygladac tka jak pokazalem. Powinien wychwytywac rozne inputy typu:

<iNpUt type="text" name="bla" value="bla" />
<input value="cos" name="a" type="button">

itd, itp.
franki01
... A co jeżeli dojdą inne argumenty? Będziesz wszystkie po kolei dopisywał? Dla mnie rozwiązania łopatologiczne to żadne rozwiązania. Ale kto jak woli. Jeżeli Ci takie coś odpowiada, to się nie rzucam...
pyro
a co za problem dorzucić inne argumenty?
franki01
Cytat(pyro @ 21.08.2008, 17:58:10 ) *
a co za problem dorzucić inne argumenty?

Właśnie chodzi o to, żeby kod działał ze wszystkimi argumentami i nie trzeba było ich dodawać. Takich rozwiązań prawie wcale nie stosuję. Wolałbym zrobić pełną automatykę. Jednak pisałem - kto jak woli. Nie kontynuujmy tego, bo wiadomo - Ty będziesz pisał, że masz rację i ja tak samo. Autor tematu sam sobie wybierze rozwiązanie.
bim2
franki01 twój kod najwięcej traci na wydajności kiedy w pętli for czytasz ciągle od nowa wielkość tablicy funkcją count. Jak już jesteśmy przy twoim kodzie to najwydajniej (jak mówisz że for jest wydajniejsze) będzie dać $c = count($tablica);
for($i=0;$i<$c;$i++)
{ }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.