preg_match

Galli

Registered
Пример:
Код:
<pre>
<?php
$html = <<<EOD
<a href="1">1 gerh</a>

<a href="2">2 gre</a>
<a href="3">3 tew</a>


<a href="4fdsg">4 gre</a>

<a href="5">5 eheth</a>
EOD;
preg_match("/<a href=\"(.*?)\">4(.*?)<\/a>/is",$html,$match);
print_r($match);
?>
От това искам да извадя: 4fdsg и gre. Всичко е добре без s-а накрая. Но като сложа s-a не работи коректно. Извежда ми gre и вместо съдържанието на 4-тия href, всичко от началото на 1-вия href до края на 4-тия.
Някаква помощ?
 
МОга ли да попитам защо слагаш изобщо модификатора s накрая!?Той се слага, за да конвертира стгринга в single line, а на теб ти трябва конкретно определен израз, нямаш preg_match_ALL :)

Израза ти е верен!
 
Знам, че е верен, но всъщност това е само пример. :)
Без s-a не работи. Сигурно решението няма да е с s. HTML е пълен с js, коментари и дори допълнителни td на някои редове. И затова ми се налага да слагам повече (.*?), а не да опиша точно всичко. И може би най-важното, което съм опитал да покажа в примера: може да има празни редове, може и да няма! Предполагам, че оттам идва проблемът. С pregmatchall резултатът е същият.
Иначе се повтаря една и съща схема.
.......<div class="не се променя"><a href="(.*?)"(.*?)rel="nofollow">Точно този ред ми трябва(.*?)</a>(.*?)rel="не се променя">(.*?)</a>...........
Зелените ми трябват, червените са обширен доста код.
 
Galli каза:
Знам, че е верен, но всъщност това е само пример. :)
Без s-a не работи. Сигурно решението няма да е с s. HTML е пълен с js, коментари и дори допълнителни td на някои редове. И затова ми се налага да слагам повече (.*?), а не да опиша точно всичко. И може би най-важното, което съм опитал да покажа в примера: може да има празни редове, може и да няма! Предполагам, че оттам идва проблемът. С pregmatchall резултатът е същият.
Иначе се повтаря една и съща схема.
.......<div class="не се променя"><a href="(.*?)"(.*?)rel="nofollow">Точно този ред ми трябва(.*?)</a>(.*?)rel="не се променя">(.*?)</a>...........
Зелените ми трябват, червените са обширен доста код.

Значи това са коментари така ли? Дай направо един конкретен пример с няколко например записа и пак отбележи кое искаш да ти се изкара.

С тези (.*?) правиш голяма каша.

Ето варианта по примера ти

PHP:
<pre>
<?php
$html = <<<EOD
<a href="1">1 gerh</a>

<a href="2">2 gre</a>
<a href="3">3 tew</a>


<a href="4fdsg">4 gre</a>

<a href="5">5 eheth</a>
EOD;
preg_match('@<a\s+href="([^<]+)"\s*>4\s+([^<]+)</a>@i',$html,$match);
unset($match[0]);
print_r($match);
?>
 
Не са само коментари, има и javascript. И в js-а има още html и css.

Не разбрах защо (.*?) е голяма каша?

Мерси за \s. Сложих почти навсякъде \s*, описах още по-подробно схемата и май стана.
 

Back
Горе