Помогите, пож-та, найти в странице контент

P
На сайте с 06.01.2009
Offline
601
682

Ребят, есть необходимость найти в странице контент, который закреплен, условно говоря, между тегами <non1> и <non2>.

То что я покажу ищет это дело только в исходном коде страницы.

А мне очень надо искать данный контент на страницах, которые уже как бы выложены на сайте.

Дело в том, что данный контент подгружается через include и само собой этот скрипт его не видит в исходнике.

Прошу помочь. Хоть намекните что исправить надо?

Понятно, что нужно что то вместо preg_match

//функция вывода текста между <non1> и <non2>

$fd = fopen("../baza/spisok/$file", "r");
while ($buffer = fgets($fd, 12288))
{
$src.=$buffer;
}
preg_match('~<non1>(.*?)<non2>~is', $src, $match);

$chchch = $match[1];
$src = 0;
fclose($fd);

собственно текст теперь в $chchch

Спасибо заранее

Ёхан Палыч
На сайте с 07.05.2006
Offline
169
#1
postavkin:
А мне очень надо искать данный контент на страницах, которые уже как бы выложены на сайте.

Я бы вместо fopen использовал file_get_contents

postavkin:
Дело в том, что данный контент подгружается через include и само собой этот скрипт его не видит в исходнике.

Не понятно, с адресами все в порядке?

postavkin:
Понятно, что нужно что то вместо preg_match

Единственная проблема с preg_match это ограничение по размеру - не более 100кб

[umka]
На сайте с 25.05.2008
Offline
456
#2

Чтобы сделать поиск по результату выполнения php-файла, нужно этот php-файл выполнить :) А искать по его внутренностям смысла нет.

Выполнить php-файл можно разными способами.

Например, с помощью функции eval или exec.

Лог в помощь!
P
На сайте с 06.01.2009
Offline
601
#3
Ёхан Палыч:
Единственная проблема с preg_match это ограничение по размеру - не более 100кб

А не скажете, какая подобная функция справится со страницей более 100кб?

postavkin добавил 20.07.2011 в 23:07

'[umka:
;9216775']Чтобы сделать поиск по результату выполнения php-файла, нужно этот php-файл выполнить :) А искать по его внутренностям смысла нет.
Выполнить php-файл можно разными способами.
Например, с помощью функции eval или exec.

Спасибо большое за помощь. Сейчас будем пробовать!

[umka]
На сайте с 25.05.2008
Offline
456
#4

Да нет у preg_match никаких ограничений на длину строки. Можно хоть гигабайт парсить. Если памяти хватит :D

somefork
На сайте с 16.08.2008
Offline
99
#5

Ограничение есть. Снимается оно простой строчкой ini_set("pcre.backtrack_limit",ХХХХХ);

ХХХХХ - это ваше ограничение. По умолчанию оно 100к.

Ремонтостан (http://remontostan.com)
[umka]
На сайте с 25.05.2008
Offline
456
#6
somefork:
Ограничение есть. Снимается оно простой строчкой ini_set("pcre.backtrack_limit",ХХХХХ);
ХХХХХ - это ваше ограничение. По умолчанию оно 100к.

Это ограничение на количество операций backtracking-а, а не на размер обрабатываемых данных.

(Такое же ограничение есть на количество рекурсивных операций)

Для проверки возьмите, да пропарсьте файлик мегабайт 10.

Ёхан Палыч
На сайте с 07.05.2006
Offline
169
#7
[umka:
Да нет у preg_match никаких ограничений на длину строки. Можно хоть гигабайт парсить. Если памяти хватит

Да, парсить можно.

[umka:
Для проверки возьмите, да пропарсьте файлик мегабайт 10.

Имелось ввиду не размер файла, а ограничение по размеру искомой комбинации, в данном случае между тегами <non1> и <non2> должно быть меньше 100к, но и это легко обходится.

[umka]
На сайте с 25.05.2008
Offline
456
#8
Ёхан Палыч:
Да, парсить можно.

Имелось ввиду не размер файла, а ограничение по размеру искомой комбинации, в данном случае между тегами <non1> и <non2> должно быть меньше 100к, но и это легко обходится.

Чтоже вы мне так не верите-то :)

Код:

$str='a'.str_repeat('b',1048576).'c';

echo 'pcre.backtrack_limit = '.ini_get('pcre.backtrack_limit').'<br>';
echo 'strlen($str) = '.strlen($str).'<br>';
if (preg_match('/(ab+c)/',$str,$matches)) {
echo 'strlen($matches[1]) = '.strlen($matches[1]);
}

Результат:

pcre.backtrack_limit = 100000

strlen($str) = 1048578
strlen($matches[1]) = 1048578
Ёхан Палыч
На сайте с 07.05.2006
Offline
169
#9
[umka:
;9217549]Чтоже вы мне так не верите-то

Да я то верю, вы уверены потому-что есть большой опыт, а речь идет конкретно о данном случае.

[umka:
;9217549]$str='a'.str_repeat('b',1048576).'c'; echo 'pcre.backtrack_limit = '.ini_get('pcre.backtrack_limit').'<br>'; echo 'strlen($str) = '.strlen($str).'<br>'; if (preg_match('/(a(.*?)c)/',$str,$matches)) { echo 'strlen($matches[1]) = '.strlen($matches[1]); }

Понятно что речь идет о количество операций backtracking-а, никто не спорит. Просто так доступнее для понимания - при таком регулярном выражении, будут ошибки если длина между тегами более 100к.

postavkin:
Понятно, что нужно что то вместо preg_match
Ёхан Палыч:
Единственная проблема с preg_match это ограничение по размеру - не более 100кб

Другими словами, нет, не нужно, проблем нет, тоесть одна решаемая.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий