Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Regex - łapanie odpowiednich tagów zamykających
SN@JPER^
post 10.11.2017, 13:32:39
Post #1





Grupa: Zarejestrowani
Postów: 266
Pomógł: 0
Dołączył: 4.01.2007
Skąd: Szczecin

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


Witam.

Mam taki kod, którym próbuję wyciągnąć dane pomiędzy tym divem. Jednak w tym divie są inne divy i kończy "łapanie" na pierwszym napotkanym, zamykającym </div>. Jak mogę zrobić, aby rozpoznawało tag odpowiednio zamykający?

  1. preg_match_all("'<div id=\"left\" class=\"mb\">(.*?)</div>'is", $html, $matches);
Go to the top of the page
+Quote Post
Pyton_000
post 10.11.2017, 13:41:53
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Łapy się obcina za parsowanie HTML przy pomocy RegEx...

Do tego są odpowiednie narzędzia np:
http://simplehtmldom.sourceforge.net/
https://github.com/sunra/php-simple-html-dom-parser

i wieeele innnych.
Go to the top of the page
+Quote Post
SN@JPER^
post 10.11.2017, 14:04:24
Post #3





Grupa: Zarejestrowani
Postów: 266
Pomógł: 0
Dołączył: 4.01.2007
Skąd: Szczecin

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


Dzięki za narzędzia! A tak dla samej wiedzy - jest jakaś magiczna sztuczka z regex, która to wyłapie?
Go to the top of the page
+Quote Post
Pyton_000
post 10.11.2017, 14:05:37
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Przeczytaj jeszcze raz co napisałem wink.gif Nie dociekaj a wyjdziesz na zdrowie smile.gif
Go to the top of the page
+Quote Post
kreatiff
post 10.11.2017, 15:36:07
Post #5





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

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


W (.*?) masz łapanie leniwe (lazy, czyli łapanie najmniej jak się da), właśnie przez ten znak zapytania. Usuń go, a dopasowywanie zmieni się w zachłanne (greedy, dopasuj maksymalnie dużo).
Możesz też użyć modyfikatora U, który zmienia (odwraca) zachłanność wzoru, bez usuwania tego znaku zapytania.

W wyniku wyrażenia regularnego nadal będziesz musiał pozbyć się nadliczbowych znaczników <div>.

Ten post edytował kreatiff 10.11.2017, 15:43:58
Go to the top of the page
+Quote Post
trzczy
post 10.11.2017, 16:31:14
Post #6





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


W ogóle tu pojawia się pytanie, co z takimi przypadkami:

  1. class = "mb"
  2. class ="mb"
  3. class= "mb"
  4. class=" mb"
  5. class = "foo mb"


Klasa może być na wiele sposobów przypisana. Czy regex ma je wszystkie uwzględniać? Zatem w przypadku regex, trzeba wiedzieć, jaki to skomplikowany problem.

Ten post edytował trzczy 10.11.2017, 16:34:44
Go to the top of the page
+Quote Post
kreatiff
post 10.11.2017, 16:55:33
Post #7





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

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


Można pominąć całkiem, skoro nie jest to w ogóle potrzebne: '#<div.*?>(.*?)</div>#is'.

ed. chyba. że chodzi ci o divy z tą konkretną klasą "mb", to wówczas można kombinować:
'#<div.*?class=".*?mb.*?".*?>(.*?)</div>#is'

Ale to może się okazać ślepym zaułkiem.

Ten post edytował kreatiff 10.11.2017, 17:00:48
Go to the top of the page
+Quote Post
Pyton_000
post 10.11.2017, 17:01:14
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


ale Wy macie problem. RegExp NIE używa się do parsowania DOM - koniec kropka...
Go to the top of the page
+Quote Post
trueblue
post 10.11.2017, 21:03:38
Post #9





Grupa: Zarejestrowani
Postów: 6 799
Pomógł: 1827
Dołączył: 11.03.2014

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


  1. $html='
  2. <div id="left" class=" mb klasa">1<p>abc</p></div>
  3. <div id="left2" class = "mb klasa">2<p>def</p></div>
  4. <div id="left3" class="mb1 klasa">3<p>ghi</p></div>
  5. <div id="left4" class="mbklasa">4<p>jkl</p></div>';
  6.  
  7. $dom = new DOMDocument;
  8. $dom->loadHTML($html);
  9. $dom->encoding = 'UTF-8';
  10. $xpath = new DOMXPath($dom);
  11. $divs = $xpath->query('//div[contains(concat(" ",normalize-space(@class)," ")," mb ")]');
  12. foreach($divs as $div){
  13. echo $div->textContent;
  14. }


http://kawalekkodu.pl/post/the-tag-is-out-...domxpath-s01e01


--------------------
Go to the top of the page
+Quote Post
SN@JPER^
post 11.11.2017, 10:40:15
Post #10





Grupa: Zarejestrowani
Postów: 266
Pomógł: 0
Dołączył: 4.01.2007
Skąd: Szczecin

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


To może lepsze pytanie - które narzędzie wybrać?

DOMXPath, php-simple-html-dom-parser, phpquery lub inne? Które jest najaktualniejsze, ma wsparcie i najczęściej się używa?
Go to the top of the page
+Quote Post
trueblue
post 11.11.2017, 10:51:49
Post #11





Grupa: Zarejestrowani
Postów: 6 799
Pomógł: 1827
Dołączył: 11.03.2014

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


Klasy DOMDocument i DOMXPath bazują na rozszerzeniu libxml, który jest częścią kompilacji PHP (najczęściej jest). Czyli są naturalną częścią PHP. XPath ma na pewno większe możliwości niż SimpleHTMLDom, co do PHPQuery, to wydaje mi się, że jeśli chodzi o selektory, to ciut większe. Zapis XPath może być trochę zniechęcający, ale możliwości spore.
Ale to zależy od Ciebie.


--------------------
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: 20.06.2025 - 04:59