Первый скрипт, регулярные выражения

12
Segey
На сайте с 23.08.2005
Offline
404
1224

Вот такой вот мой первый скриптик, ручной труд так сказать :%:?%:?%, поэтому пора что-то делать :)

Скажите где ошибки, суть скрипта простая:

Должен находить во всех файлах (в той папке, где лежит сам) текст между <h2> </h2>, но так, чтобы там не было слова "Бизнес". Как нашел, так в том же файле находит title и в конец заголовка добавляет то, что нашел до этого в <h2>.



<?php
$array = array (); // Задал массив в который нужно будет записывать потом то что найдет скрипт
for ($i = 1; $i < 54; $i++) { // Теперь нужен цикл, чтобы заходить во все файлы по очереди
$fp = fopen(" $i .php", "r+""w+"); // Открываем файл
preg_grep("/^<h2>(?!Бизнес)(.*)</h2>$/", $array); // Ищем в <h2> и записываем в массив
preg_replace ("/^</title>$"); $array </title>/"); //
fclose($fp); // Закрываем файл
}
echo ($p_array);
?>

Очень непонятем момент с массивом и тем, что потом происходит с тем тчо нашел скрипт. Будет ли он это сохранять? Нужно ли было объявлять массив так как я это сделал? Если он записал в массив то тчо нужно, правильно ли я добавил на следующей строке? Еще непонятно, почему именно массив нужен (так было в примере с регулярными выражениями) если я там просто поставлю переменную (не объявляя ее по сути т.к. это не обязательно как я понял) и ее буду перезаписывать т.к. если я правильно понял, то массив нужен был бы мне, если бы я хотел все найденные значения потом сохранить т.е. они бы лежали себе в массиве :rolleyes:

Просто с синтаксисом полные дрова и пониманием многих вещей :confused: Расскажите кому не сложно?

Brexit - уже совсем рядом. (https://about-this-model.blogspot.com/2019/03/brexit.html)
Dalim
На сайте с 13.01.2006
Offline
47
#1

В корне неправильно

<?php

$array = array (); // Задал массив в который нужно будет записывать потом то что найдет скрипт

for ($i = 1; $i < 54; $i++) { // Теперь нужен цикл, чтобы заходить во все файлы по очереди

$fp = file_get_contents("$i.php"); // Открываем файл

// preg_grep("/^<h2>(?!Бизнес)(.*)</h2>$/", $array); -- непойму, что ты пытаешься тут найти, но синтаксис тут другой:

// array preg_grep($string, array $match)

// Ищем в <h2> и записываем в массив. Тут тоже надо по другому, если конечно ты хотел найти что лежит в <title>

if (preg_match("/<title>(.*)</title>/", $fp, $matches))

{ $array[] = $matches[1]; } //

fclose($fp); // Закрываем файл

}

print_r ($array);

?>

___________________________________________

$array = array();

for ($i = 0; $i < 54; $i++)

{

$fp = file_get_contents($i.'.php');

if (preg_match('/<h2>(!Бизнес)</h2>/'), $fp, $match))

{

if (preg_match('/<title>(.*)</title>/', $fp, $matches))

{

$array[] = $matches[1].' '.$match[1]

}

}

}

print_r($array);

Если не ошибаюсь, то так...

Oniks
На сайте с 22.08.2005
Offline
176
#2

$fp = fopen(" $i .php", "r+""w+");

Сомневаюсь, что так прокатит, во первых, имя файла будет не '1.php', а ' 1 .php', т.е. с пробелами. Во-вторых, fopen может принимать только 1 аргумент, задающий доступ к файлу, так что надо его открывать либо для чтения, либо для записи, а в вашем случае и для того, и для другого.

preg_grep("/^<h2>(?!Бизнес)(.*)</h2>$/",  $array);                                    //   Ищем в <h2> и записываем в массив

preg_replace ("/^</title>$"); $array </title>/");

Внимательнее читайте мануал:

array preg_grep (string pattern, array input)

preg_grep() возвращает массив, состоящий из элементов массива input, совпавших с данным pattern.

Поскольку на момент вызова preg_grep $array пуст, то ничего она не найдет.

Для решения вашей задачи я бы сделал по-другому:

1. Считал весь файл в строку через file_get_contents();

2. Нашел все вхождения <h2>(!Бизнес)....</h2> и записал бы их в массив с помощью eregi();

3. Если нужно, заменил бы все вхождения </title> на {результат поиска <h2>}</title> простым str_replace().

Профессиональные услуги фотографа в Москве и области (http://www.oniks-photo.ru/) покупаю стать и ссылки с сайтов про охоту
Segey
На сайте с 23.08.2005
Offline
404
#3
Oniks:
Сомневаюсь, что так прокатит, во первых, имя файла будет не '1.php', а ' 1 .php', т.е. с пробелами. Во-вторых, fopen может принимать только 1 аргумент, задающий доступ к файлу, так что надо его открывать либо для чтения, либо для записи, а в вашем случае и для того, и для другого.

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

Dalim,

нет неработает:

Parse error: parse error, unexpected ',' in z:\home\scripts.ru\ on line 7

А почему так изменено начало и конец строки, там же нужно ставить ^ и $ ?

Вот еще, что непонятно:

Зачем вы накладываете условия? Можно же просто построчно выполнить... а зачем конструкция с условиями, если у них только по ветке да все идет и смысла в условие нет впринципе т.к. исход всеравно один или пошагово не выполнится? 😕

Oniks
На сайте с 22.08.2005
Offline
176
#4
Segey:
В книге написано, что это возможно, там таблица с модификаторами и описанием

Гм.. не знаю, что там за книга такая... Цитата:

'r+' - Открыть для чтения и записи; поместить указатель в начало файла.

'w+' - Открыть для чтения и записи; поместить указатель в начало файла и усечь файл до нулевой длины. Если файл не существует, делается попытка создать его.

А 2 аргумента он принимать не может, ибо тогда может быть ошибок с доступом к файлу немеряно. Таким образом, перед записью вам надо использовать fopen('...', 'w+').

Segey
На сайте с 23.08.2005
Offline
404
#5

Oniks,

Энди Харрис "PHP и MySql для начинающих"

тип: чтение и запись: "r+""w+".

СКОРПИОН
На сайте с 05.01.2006
Offline
120
#6

Segey, по данному вопросу:

http://phpclub.ru/manrus/f/fopen.html .

И, вообще, - рекомендую:

http://phpclub.ru/manrus/

• Контекстные ссылки с внутренних страниц навсегда (/ru/forum/370882) • Качественные сайты для заработка на контекстной рекламе и ссылках
Segey
На сайте с 23.08.2005
Offline
404
#7

СКОРПИОН,

На книге написано "PHP Club Рекомендует" :)

СКОРПИОН
На сайте с 05.01.2006
Offline
120
#8
Segey:
СКОРПИОН,
На книге написано "PHP Club Рекомендует"

В оффлайне ссылки тоже имеют вес ;)

Dalim
На сайте с 13.01.2006
Offline
47
#9

Segey, извини... ошибку допустил

после $array[] = $matches[1].' '.$match[1] поставь ;

И проверь, вроде должно работать...

начало и конец строки ставить не надо... потому как у тебя весь файл в одной строке и следовательно никаких title и h2 в начале быть неможет.

Открывать файл советую функцией file_get_contents();

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

Проверь, если работать небудет, дай адрес страницы, которую надо пропарсить (примерчик), я для нее напишу и сразу опробую.

Dalim
На сайте с 13.01.2006
Offline
47
#10

Oniks, Вы не правы, fopen может принимать несколько модификаторов, только перечисляться они должны в одном аргументе, например "r+b" или "wb" и т.п.

12

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