Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyłuskanie danych ze strony, wyrażenia regularne
porady-it.pl
post 20.08.2008, 19:53:20
Post #1





Grupa: Zarejestrowani
Postów: 89
Pomógł: 20
Dołączył: 13.05.2007
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Kurs Video PHP i MySQL, porady-it.pl - gotowe rozwiązania dla webmasterów
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 19)
sunlifter
post 20.08.2008, 20:42:58
Post #2





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 20.08.2008
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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/
Go to the top of the page
+Quote Post
porady-it.pl
post 20.08.2008, 21:19:21
Post #3





Grupa: Zarejestrowani
Postów: 89
Pomógł: 20
Dołączył: 13.05.2007
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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>


--------------------
Kurs Video PHP i MySQL, porady-it.pl - gotowe rozwiązania dla webmasterów
Go to the top of the page
+Quote Post
pyro
post 20.08.2008, 21:27:10
Post #4





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


  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. ?>


Ten post edytował pyro 20.08.2008, 21:28:04


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
porady-it.pl
post 20.08.2008, 22:05:49
Post #5





Grupa: Zarejestrowani
Postów: 89
Pomógł: 20
Dołączył: 13.05.2007
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Kurs Video PHP i MySQL, porady-it.pl - gotowe rozwiązania dla webmasterów
Go to the top of the page
+Quote Post
pyro
post 20.08.2008, 22:20:09
Post #6





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


sie zajmij tym sam smile.gif


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
bim2
post 20.08.2008, 23:35:18
Post #7





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Jeśli name będzie zawsze przed value to
  1. <?php
  2. $preg = preg_match_all('|<input.*?name="(.*?)".*?value="(.*?)">|im', $text, $tablica_inputow);
  3. ?>


--------------------
Go to the top of the page
+Quote Post
pyro
post 21.08.2008, 09:34:25
Post #8





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


bim2 twoj regex jest bledny


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
bim2
post 21.08.2008, 09:36:48
Post #9





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Dużo mi to nie mówi. Wyskakuje jakiś błąd w regexie, czy nic nie znajduje, a może znajduje tylko część?


--------------------
Go to the top of the page
+Quote Post
pyro
post 21.08.2008, 09:59:23
Post #10





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


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 .*?


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
franki01
post 21.08.2008, 10:56:33
Post #11





Grupa: Zarejestrowani
Postów: 508
Pomógł: 75
Dołączył: 2.11.2005
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
bim2
post 21.08.2008, 14:07:13
Post #12





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Go to the top of the page
+Quote Post
franki01
post 21.08.2008, 14:23:13
Post #13





Grupa: Zarejestrowani
Postów: 508
Pomógł: 75
Dołączył: 2.11.2005
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
pyro
post 21.08.2008, 15:11:36
Post #14





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


po co wy cuda niewidy robicie, przecież to wszystko można w jednym regexie załatwic...


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
franki01
post 21.08.2008, 15:51:49
Post #15





Grupa: Zarejestrowani
Postów: 508
Pomógł: 75
Dołączył: 2.11.2005
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
pyro
post 21.08.2008, 16:50:42
Post #16





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


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.


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
franki01
post 21.08.2008, 16:56:15
Post #17





Grupa: Zarejestrowani
Postów: 508
Pomógł: 75
Dołączył: 2.11.2005
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


... 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...
Go to the top of the page
+Quote Post
pyro
post 21.08.2008, 16:58:10
Post #18





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


a co za problem dorzucić inne argumenty?


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
franki01
post 21.08.2008, 17:02:36
Post #19





Grupa: Zarejestrowani
Postów: 508
Pomógł: 75
Dołączył: 2.11.2005
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
bim2
post 22.08.2008, 09:47:37
Post #20





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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++)
{ }


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 19:54