preg_match_all

stoqnski

Registered
Имам текст:

<body>....<div><h2> <a href="/add-test---1.html">hi </a> </h2>....

<h2> <a href="/add-test---2.html">hi </a> </h2>....

<h2> <a href="/add-test---3.html">hi </a> </h2>.....

<h2> <a href="/add-test---4.html">hi </a> </h2>...</div></body>

Как да взема всеки url адрес на ..<h2> <a href="#>...</a> .. </h2> в случая са:

/add-test---1.html
/add-test---2.html
/add-test---3.html
/add-test---4.html

моите опити се провалиха и реших да попитам :D
 
Това е едноо грубо решение на проблема но се надявам да ти върши работа! :)
PHP:
$t = '<body>....<div><h2> <a href="/add-test---1.html">hi </a> </h2>....

<h2> <a href="/add-test---2.html">hi </a> </h2>....

<h2> <a href="/add-test---3.html">hi </a> </h2>.....

<h2> <a href="/add-test---4.html">hi </a> </h2>...</div></body>';
preg_match_all('/<h2>.*href=\"(.*?)\"/',$t,$matches);
echo '<pre>';
print_r($matches[1]);
https://regex101.com/r/kA2iQ4/1
 
anonimen каза:
Съвсем същия въпрос тук:
http://web-tourist.net/forum/viewtopic.php?p=662275#662275
Защо Парсър? За нещо толкова дребно трябва да минавам през разни врътки и прочие. Какво му е на регулярният израз? Щом го настроя ще е много по-бърз от тези парсъри. Ако ги ползвате само защото са обектно ориентирани, нищо чудно, че новите системи изискват по-силен хардуер. :D :D :D За нещо толкова просто трябва да минавам през инстанция на клас и викане на методи когато всичко това видимо го решавам с един ред (за случаят) и после се обхождат нещата.
 
То и аз така си мислех, но няколко пъти попадах на негативни мнения и вече не съм сигурен какво и как :)

Едит: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
 
dakata__92 каза:
Това е едноо грубо решение на проблема но се надявам да ти върши работа! :)
PHP:
$t = '<body>....<div><h2> <a href="/add-test---1.html">hi </a> </h2>....

<h2> <a href="/add-test---2.html">hi </a> </h2>....

<h2> <a href="/add-test---3.html">hi </a> </h2>.....

<h2> <a href="/add-test---4.html">hi </a> </h2>...</div></body>';
preg_match_all('/<h2>.*href="(.*?)"/',$t,$matches);
echo '<pre>';
print_r($matches[1]);
https://regex101.com/r/kA2iQ4/1

този пример работи , но когато направя $t = file_get_contents чрез който извлича същия код като отгоре не работи .... дава ми празен масив
 
stoqnski каза:
dakata__92 каза:
Това е едноо грубо решение на проблема но се надявам да ти върши работа! :)
PHP:
$t = '<body>....<div><h2> <a href="/add-test---1.html">hi </a> </h2>....

<h2> <a href="/add-test---2.html">hi </a> </h2>....

<h2> <a href="/add-test---3.html">hi </a> </h2>.....

<h2> <a href="/add-test---4.html">hi </a> </h2>...</div></body>';
preg_match_all('/<h2>.*href="(.*?)"/',$t,$matches);
echo '<pre>';
print_r($matches[1]);
https://regex101.com/r/kA2iQ4/1

този пример работи , но когато направя $t = file_get_contents чрез който извлича същия код като отгоре не работи .... дава ми празен масив
Дай съдържанието на променливата на file_get_contents();
 
PHP:
$t = '<h2>

<a href="/parcel-plovdiv-okolovrastno-shose--anno1590865.html">


Парцел, Пловдив, Околовръстно Шосе
</a>
</h2>


<ul class="sp">
<li>Площ: <span class="sd">8531 кв. м.</span></li>
</a>

<h2>

<a href="/parcel-plovdiv-okolovrastno-shose--anno1590865.html">


Парцел, Пловдив, Околовръстно Шосе
</a>
</h2>';
preg_match_all('/<h2>(?s).*href=\"(.*?)\"(?s).*<\/h2>/',$t,$matches);
echo '<pre>';
print_r($matches[1]);
 
Възможен проблем ще има ако файлът съдържа ' вместо " или ако има нови редове вътре в линка. Пробвай с това:

https://regex101.com/r/kA2iQ4/3

Код:
<h2>.*?href=(\'|\")(.*?)\g{1}.*?<\/h2>
 
Този регулярен за неговият случай ще му свърши работа.
PHP:
'/<h2>([\d\D]*?)href=\"(.*?)\"([\d\D]*?)<\/h2>/'
 
dakata__92 каза:
Този регулярен за неговият случай ще му свърши работа.
PHP:
'/<h2>([\d\D]*?)href="(.*?)"([\d\D]*?)<\/h2>/'
Можеш да го опростиш като замениш [\d\D] с точка и после като флаг сложиш s.
От скобите ти трябват само средните, без другите пак ще работи както трябва :)

Код:
/<h2>.*?href="(.*?)".*?<\/h2>/s
(само давам идея как да се опрости, regex-ът си на даката)
 
Впрочем това със /s накрая за единичната линия е доста интересна врътка. Не бях се сетил за нея. :)
 

Back
Горе