[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не работает шаблон для preg_match_all
spartiat
Здравствуйте.У меня задача периодически выдергивать из страницы данные из двух блоков и записывать в бд.Но код с одним блоком справляется на ура,а с другим никак не работает
здесь работает нормально:
preg_match_all('%<a  target="_blank" href="(.*?)">%', $page, $result, PREG_PATTERN_ORDER);
$s = $result[1];

а здесь шаблон не работает:
preg_match_all('%<p class="nnn" >(.*?)</p>%', $page, $resultt, PREG_PATTERN_ORDER);
$an = $resultt[1];

вот сам html фрагмента ,привожу без форматирования,как есть,только для краткости текст сокращу:
                    <P class="nnn" >
<B>
текст</B>
</P>

Подскажите пожалуйста в чем ошибка.



Спустя 6 минут, 18 секунд (18.01.2011 - 18:28) twin написал(а):
Модификаторы is поставь

Спустя 1 минута, 1 секунда (18.01.2011 - 18:29) ZSH написал(а):
preg_match_all('%<p class="nnn" >(.*?)</p>%i', $page, $resultt, PREG_PATTERN_ORDER);

в паттерне p-маленькое, а в HTML большое

Спустя 45 минут, 52 секунды (18.01.2011 - 19:15) spartiat написал(а):
Спасибо ребята что откликнулись.Модификаторы я перепробовал,результат тот же ,такой вот шаблон:
'%>(.*?)</%'
работает ,но естественно вфдергивает вместе с тем что надо кучу мусора,а с модификаторами и без,с большой и маленькой "P" нет.
попробуйте сами тот код штмл что я привел.

ps:twin примите благодарность за классный сайт irbis team,много-много я у вас почерпнул ;)

Спустя 1 минута, 50 секунд (18.01.2011 - 19:16) DedMorozzz написал(а):
уверен, что модификатор "s" имеет место быть? Симптомы очень похожи, когда без него

Спустя 6 минут, 19 секунд (18.01.2011 - 19:23) DedMorozzz написал(а):
$a = '                    <P class="nnn" >
<B>текст</B>
</P>'
;


preg_match_all('#<p.*?>(.*?)</p>#is',$a,$arr);
echo htmlspecialchars($arr[1][0]);

Спустя 9 минут, 23 секунды (18.01.2011 - 19:32) spartiat написал(а):
DedMorozzz
Спасибо,так код работает.Но почему не работает когда указываю класс:
class="nnn"
?
Без этого ,код работает и с теми блоками которые имеют другой класс и которые не нужны.
Можноли это учесть?

Спустя 35 минут, 40 секунд (18.01.2011 - 20:08) DedMorozzz написал(а):
$a = '                    <P class="nnn" >
<B>текст</B>
</P>'
;


preg_match_all('#<p class=(\'|")nnn\\1.*?>(.*?)</p>#is',$a,$arr);
echo htmlspecialchars($arr[2][0]);

Мона упростить <p class=(\'|")nnn\\1 до <p class="nnn"
Но это будет менее универсально. Сейчас не важно в каких кавычках nnn стоит, хоть в одинарных, хоть в 2х будет работать.
Заметь, если уберёшь условие с кавычками - номер массива сдвинется на 1

Спустя 13 минут, 19 секунд (18.01.2011 - 20:21) spartiat написал(а):
DedMorozzz
Огромное благодарю!Не первый раз выручаете!
Все работает.Узнал сегодня много нового о регулярках!

Спустя 27 минут, 13 секунд (18.01.2011 - 20:48) spartiat написал(а):
Еще один вопрос касаемо данного примера :как почистить сразу все значения массива от тегов и пробелов?Мое
$an = trim ( strip_tags($resultt[2]));
не работает :(

Спустя 9 минут, 47 секунд (18.01.2011 - 20:58) DedMorozzz написал(а):
spartiat
покажи весь код. Ибо в примере, котоырй последний кинул, последнюю строчку заменил на:
echo htmlspecialchars(strip_tags($arr[2][0]));
И всё норм работает!

Спустя 13 минут, 22 секунды (18.01.2011 - 21:11) spartiat написал(а):
$page = '                    <P class="nnn" >
<B>текст</B>
</P>

<P class="nnn" >
<B>текст2</B>
</P>

<P class="nnn" >
<B>текст n</B>
</P>
'
;

preg_match_all('#<p class=(\'|")nnn\\1.*?>(.*?)</p>#is', $page, $resultt, PREG_PATTERN_ORDER);
$an = =htmlspecialchars(strip_tags($resultt[2][0]));

echo '<pre>';
print_r($an);
echo '</pre>';


оно работает ,но выводит только один елемент масива.

даже вот полный вариант:
$page = '                    <P class="nnn" >
<B>текст</B>
</P>

<a target="_blank" href="aaa">

<P class="nnn" >
<B>текст2</B>
</P>

<a target="_blank" href="aaa2">

<P class="nnn" >
<B>текст n</B>
</P>

<a target="_blank" href="aaa n">'
;

preg_match_all('#<p class=(\'|")nnn\\1.*?>(.*?)</p>#is', $page, $resultt, PREG_PATTERN_ORDER);
$an =htmlspecialchars(strip_tags($resultt[2][0]));

preg_match_all('%<a target="_blank" href="(.*?)">%', $page, $result, PREG_PATTERN_ORDER);
$s = $result[1];

echo '<pre>';
print_r($an);
echo '</pre>';
echo '</br>';
echo '<pre>';
print_r($s);
echo '</pre>';


В принципе главная задача избавить строки в массиве от пробелов в начале и конце строк,

но вот даже просто
$an =trim($resultt[2]);
работать не хочет,хотя так
$an = $resultt[2] ;
echo '<pre>';
print_r($an);
echo '</pre>';

весь массив прекрасно выводится.

Спустя 20 минут, 38 секунд (18.01.2011 - 21:32) DedMorozzz написал(а):
если будет массив тогда в цикле прогоняй:
preg_match_all('#<p class=(\'|")nnn\\1.*?>(.*?)</p>#is', $a, $res);

for($i=0;$i<count($res[2]);$i++){
echo htmlspecialchars(strip_tags($res[2][$i]))."<br />";
}

Спустя 2 минуты, 34 секунды (18.01.2011 - 21:35) inpost написал(а):
добавь ещё модификатор u, для работы с UTF-8.

Спустя 18 минут, 1 секунда (18.01.2011 - 21:53) spartiat написал(а):
Цитата
если будет массив тогда в цикле прогоняй:
preg_match_all('#<p class=(\'|")nnn\\1.*?>(.*?)</p>#is', $a, $res);

for($i=0;$i<count($res[2]);$i++){
    echo htmlspecialchars(strip_tags($res[2][$i]))."<br />";
}
Допер !
Спасибо DedMorozzz!Ты ас!
Рабочий вариант:

preg_match_all('#<p class=(\'|")nnn\\1.*?>(.*?)</p>#is', $a, $res);
for($i=0;$i<count($resultt[2]);$i++){
$an[] = trim(htmlspecialchars(strip_tags($resultt[2][$i])));
}
echo '<pre>';
print_r($an);
echo '</pre>';

Спустя 13 минут, 40 секунд (18.01.2011 - 22:06) spartiat написал(а):
Все допер!Огромное благодарю!Рабочий вариант:
preg_match_all('#<p class=(\'|")nnn\\1.*?>(.*?)</p>#is', $a, $res);
for($i=0;$i<count($resultt[2]);$i++){
$an[] = trim($resultt[2][$i]);
}
echo '<pre>';
print_r($an);
echo '</pre>';
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.