[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не могу заменить строку
kich
У меня есть файл "link.xml" с такой вот структурой:

HTML
<?xml version="1.0" encoding="windows-1251"?>
<ARTICLES>
<FILE filename="dostavka.php">1</FILE>
<FILE filename="electronic.php">2</FILE>
</ARTICLES>


Где цифры должны будут изменяться скриптом:
PHP
$basename='link.xml';
$all_count file_get_contents($basename);
if (
preg_match("/<ARTICLES>(.*)<\/ARTICLES>/isU"$all_count$artic_count)){
    if (
preg_match("/<FILE filename=\"$filename\">(.*)<\/FILE>/isU"$artic_count[1], $account)){
        
$count=($account[1]+1);
        
$file=file($basename);
        
$f=fopen($file,"w");
        
$f=str_replace("<FILE filename=\"$filename\">$account[1]</FILE>","<FILE filename=\"$filename\">$count</FILE>",$f);
        
$body_bot_text="<small>".$count."</small>";
    }
}


Но в нем видать логика не верная, так как увеличенный на 1 $count не изменяет первоначального показателя, всю ночь с хмельной головой сидел разбирался, так и ни как не смог найти ответа.




Спустя 39 минут, 18 секунд (21.02.2009 - 14:02) sergeiss написал(а):
Цитата (kich @ 21.02.2009 - 13:23)
У меня есть файл "link.xml" с такой вот структурой:

HTML
<?xml version="1.0" encoding="windows-1251"?>
<ARTICLES>
<FILE filename="dostavka.php
">1</FILE>
<FILE filename="electronic.php">2</FILE>
</ARTICLES>


Где цифры должны будут изменяться скриптом:
PHP
$basename='link.xml';
$all_count = file_get_contents($basename);
if (preg_match(\\"/<ARTICLES>(.*)<\/ARTICLES>/isU\\", $all_count, $artic_count)){
    if (preg_match(\\"/<FILE filename=\\\"$filename\\\">(.*)<\/FILE>/isU\\", $artic_count[1], $account)){
        $count=($account[1]+1);
        $file=file($basename);
        $f=fopen($file,\\"w\\");
        $f=str_replace(\\"<FILE filename=\\\"$filename\\\">$account[1]</FILE>\\",\\"<FILE filename=\\\"$filename\\\">$count</FILE>\\",$f);
        $body_bot_text=\\"<small>\\".$count.\\"</small>\\";
    }
}


Но в нем видать логика не верная, так как увеличенный на 1 $count не изменяет первоначального показателя, всю ночь с хмельной головой сидел разбирался, так и ни как не смог найти ответа.

Даже если не вникать в регулярки (а я в них не вникал в твоем скрипте), то нарушение логики "налицо".
PHP
        $file=file($basename); // сохранил содержимое файла в массив $file
        $f=fopen($file,"w"); // пытаешься открыть файл, указывая вместо имени некий массив; в переменной $f в итоге должно быть записано FALSE
        $f=str_replace("<FILE filename=\"$filename\">$account[1]</FILE>","<FILE filename=\"$filename\">$count</FILE>",$f); // откуда-откуда данные взял??? Из логической переменной, равной FALSE?


И второй вопрос - зачем использовать str_replace, если ты работаешь с регулярками? Чем тебе preg_replace "не угодил"?

Спустя 17 минут, 25 секунд (21.02.2009 - 14:20) kich написал(а):
Цитата (sergeiss @ 21.02.2009 - 15:02)
Даже если не вникать в регулярки (а я в них не вникал в твоем скрипте), то нарушение логики "налицо".
PHP
        $file=file($basename); // сохранил содержимое файла в массив $file
        $f=fopen($file,"w"); // пытаешься открыть файл, указывая вместо имени некий массив; в переменной $f в итоге должно быть записано FALSE
        $f=str_replace("<FILE filename=\"$filename\">$account[1]</FILE>","<FILE filename=\"$filename\">$count</FILE>",$f); // откуда-откуда данные взял??? Из логической переменной, равной FALSE?


И второй вопрос - зачем использовать str_replace, если ты работаешь с регулярками? Чем тебе preg_replace "не угодил"?

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

А как выполнить через [b]preg_replace[b] применительно именно к этой поставленной задачи, а то я мануал поюзал, но чтот акромя ниже следующего ничего не придумал, и то, этот вариант не работает:
PHP
if (preg_match("/<ARTICLES>(.*)<\/ARTICLES>/isU"$all_count$artic_count)){
    if (
preg_match("/<FILE filename=\"$filename\">(.*)<\/FILE>/isU"$artic_count[1], $account)){
        
$count=($account[1]+1);
        
preg_replace("<FILE filename=\"$filename\">$account[1]</FILE>","<FILE filename=\"$filename\">$count</FILE>",$artic_count[1]);
        
$body_bot_text="<small>".$count."</small>";
    }
}

Спустя 16 минут, 14 секунд (21.02.2009 - 14:36) Viking написал(а):
если уж работать с хмл, то лучше использовать домовские функции, хоть и оно запарно

PHP
<?php
$filename 
"dostavka.php";

$basename='link.xml';

$doc = new domDocument;
$doc->load($basename);
$item $doc->getElementsByTagName("FILE");
for(
$i=0$i<$item->length;$i++)
  if(
$item->item($i)->getAttributeNode("filename")->nodeValue == $filename) {
    
$item->item($i)->nodeValue++;
    break;
  }

$doc->save($basename);


Спустя 10 минут, 28 секунд (21.02.2009 - 14:46) kich написал(а):
Цитата (Viking @ 21.02.2009 - 15:36)
если уж работать с хмл, то лучше использовать домовские функции, хоть и оно запарно

PHP
<?php
$filename 
= "dostavka.php";

$basename='link.xml';

$doc = new domDocument;
$doc->load($basename);
$item = $doc->getElementsByTagName("FILE");
for(
$i=0; $i<$item->length;$i++)
  if($item->item($i)->getAttributeNode("filename")->nodeValue == $filename) {
    $item->item($i)->nodeValue++;
    break;
  }

$doc->save($basename);

При использовании домовских функций, скрипт вообще не пашет

Спустя 2 минуты, 37 секунд (21.02.2009 - 14:49) sergeiss написал(а):
Если уж говорить именно про XML, то есть целый набор функций для его разбора, имена которых начинаются на XML_*****. Правда, я с ними не работал, но в хэлпе всё выглядит красиво smile.gif

Спустя 13 минут, 51 секунда (21.02.2009 - 15:03) Viking написал(а):
Цитата
При использовании домовских функций, скрипт вообще не пашет

видимо php без xml-ля собран, зря, оно надежнее и красивее
можно SimpleXML попробовать, если с ним пашет

в твоем случае как я понимаю должно быть что-то наподобие
$artic_count[1] = preg_replace("/<FILE filename=\"$filename\">$account[1]<\/FILE>/","<FILE filename=\"$filename\">$count</FILE>",$artic_count[1]);

Спустя 47 минут, 11 секунд (21.02.2009 - 15:50) kich написал(а):
Цитата (Viking @ 21.02.2009 - 16:03)
Цитата
При использовании домовских функций, скрипт вообще не пашет

видимо php без xml-ля собран, зря, оно надежнее и красивее
можно SimpleXML попробовать, если с ним пашет

в твоем случае как я понимаю должно быть что-то наподобие
$artic_count[1] = preg_replace("/<FILE filename=\"$filename\">$account[1]<\/FILE>/","<FILE filename=\"$filename\">$count</FILE>",$artic_count[1]);

А как в таком случае будет выглядить код целиком?

Спустя 23 минуты, 45 секунд (21.02.2009 - 16:14) Viking написал(а):
Цитата
А как в таком случае будет выглядить код целиком?

можешь на меня рассердиться, но мои религиозные взгляды не позволяют мне бесплатно писать для других целиком код для работы с xml через регулярки в субботу во второй половине дня

с preg_replace тут все просто, она делает нужную тебе замену и помещает результат обратно в $artic_count[1], с остальным вроде еще проще

Спустя 6 минут, 5 секунд (21.02.2009 - 16:20) kich написал(а):
Цитата (Viking @ 21.02.2009 - 17:14)
Цитата
А как в таком случае будет выглядить код целиком?

можешь на меня рассердиться, но мои религиозные взгляды не позволяют мне бесплатно писать для других целиком код для работы с xml через регулярки в субботу во второй половине дня

с preg_replace тут все просто, она делает нужную тебе замену и помещает результат обратно в $artic_count[1], с остальным вроде еще проще

))) Религия - это святое, я тож чтот немного приборзел и обленился

Лан, что насчет preg_replace все понятно, а вот чтоб записать в файл изменения, т.е. $artic_count[1], то что нужно вписать в fwrite()?

Спустя 4 минуты, 29 секунд (21.02.2009 - 16:24) Viking написал(а):
в данном случае лучше вообще файл не открывать:
file_put_contents($basename,$artic_count[1]);

Спустя 1 час, 21 минута, 55 секунд (21.02.2009 - 17:46) kich написал(а):
Цитата (Viking @ 21.02.2009 - 17:24)
в данном случае лучше вообще файл не открывать:
file_put_contents($basename,$artic_count[1]);

Выручайте, все равну скрипт не работает, не заменяет и не записывает, что хотя бы не правильно, подскажите
PHP
$basename='link.xml';
$all_count file_get_contents($basename);
if (
preg_match("/<ARTICLES>(.*)<\/ARTICLES>/isU"$all_count$artic_count)){
    if (
preg_match("/<FILE filename=\"$filename\">(.*)<\/FILE>/isU"$artic_count[1], $account)){
        
$count=($account[1]+1);
        
$artic_count[1] = preg_replace("/<FILE filename=\"$filename\">$account[1]<\/FILE>/","<FILE filename=\"$filename\">$count</FILE>",$artic_count[1]);
        
file_put_contents($basename,$artic_count[1]);
        
$body_bot_text="<small>".$count."</small>";
    }else{
        
$body_bot_text="<small>подгруппа не открыта</small>";
    }
}else{
        
$body_bot_text="<small>группа не открыта</small>";
}


Спустя 21 минута, 34 секунды (21.02.2009 - 18:08) Viking написал(а):
PHP
$basename='link.xml';
$all_count = file_get_contents($basename);
if (preg_match("/<ARTICLES>(.*)<\/ARTICLES>/ims", $all_count, $artic_count)){
    if (preg_match("/<FILE filename=\"$filename\">(.*)<\/FILE>/isU", $artic_count[1], $account)){//echo "yes";var_dump($account);
        $count=($account[1]+1);
        $artic_count[0] = preg_replace("/<FILE filename=\"$filename\">$account[1]<\/FILE>/","<FILE filename=\"$filename\">$count</FILE>",$artic_count[0]);
        file_put_contents($basename,$artic_count[0]);
        $body_bot_text="<small>".$count."</small>";
    }else{
        $body_bot_text="<small>подгруппа не открыта</small>";
    }
}else{
        $body_bot_text="<small>группа не открыта</small>";
}

индекс у $artic_count должен быть нулевой просто
у меня работает
(не забудь там $filename где-то определить)

Спустя 4 минуты, 16 секунд (21.02.2009 - 18:12) Viking написал(а):
$artic_count[0] это весь файл, а $artic_count[1] это только строки, соответствующие паттерну
но вообще записывать то он должен был в любом случае, хоть и не правильно, возможно у тебя где-то еще косяк, если это не заработает

Спустя 11 минут, 9 секунд (21.02.2009 - 18:23) kich написал(а):
Цитата (Viking @ 21.02.2009 - 19:12)
$artic_count[0] это весь файл, а $artic_count[1] это только строки, соответствующие паттерну
но вообще записывать то он должен был в любом случае, хоть и не правильно, возможно у тебя где-то еще косяк, если это не заработает

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

Спустя 11 минут, 47 секунд (21.02.2009 - 18:35) Viking написал(а):
был еще косяк с тегом xml, теперь точно все работает:
link.xml:
HTML
<?xml version="1.0" encoding="windows-1251"?>
<ARTICLES>
<FILE filename="dostavka.php">1</FILE>
<FILE filename="electronic.php">2</FILE>
</ARTICLES>

сам скрипт:
PHP
<?php
$filename 
"dostavka.php";


$basename='link.xml';
$all_count file_get_contents($basename);
if (
preg_match("/<ARTICLES>(.*)<\/ARTICLES>/ims"$all_count$artic_count)){
    if (
preg_match("/<FILE filename=\"$filename\">(.*)<\/FILE>/isU"$artic_count[1], $account)){//echo "yes";var_dump($account);
        
$count=($account[1]+1);
        
$all_count preg_replace("/<FILE filename=\"$filename\">$account[1]<\/FILE>/","<FILE filename=\"$filename\">$count</FILE>",$all_count);
        
file_put_contents($basename,$all_count);
        
$body_bot_text="<small>".$count."</small>";
    }else{
        
$body_bot_text="<small>подгруппа не открыта</small>";
    }
}else{
        
$body_bot_text="<small>группа не открыта</small>";
}



link.xml после запуска самого скрипта:
HTML
<?xml version="1.0" encoding="windows-1251"?>
<ARTICLES>
<FILE filename="dostavka.php">2</FILE>
<FILE filename="electronic.php">2</FILE>
</ARTICLES>

Спустя 13 минут, 40 секунд (21.02.2009 - 18:49) kich написал(а):
Цитата (Viking @ 21.02.2009 - 19:12)
$artic_count[0] это весь файл, а $artic_count[1] это только строки, соответствующие паттерну
но вообще записывать то он должен был в любом случае, хоть и не правильно, возможно у тебя где-то еще косяк, если это не заработает

Ошибка возникает именно тогда когда я обращаюсь к функции
PHP
file_put_contents($basename,$artic_count[0]);

т.е. проще говоря, строка не записывается

Спустя 3 минуты, 52 секунды (21.02.2009 - 18:52) Viking написал(а):
какая именно ошибка?
доступа на запись чтоли нет? или у тебя php4?
блин че за манера "ошибка возникает..." тема про телепатов уже подзадолбала

Спустя 11 минут, 9 секунд (21.02.2009 - 19:04) kich написал(а):
Цитата (Viking @ 21.02.2009 - 19:52)
какая именно ошибка?
доступа на запись чтоли нет? или у тебя php4?
блин че за манера "ошибка возникает..." тема про телепатов уже подзадолбала

-сервак расшифровку ошибок не дает;
-доступ к файлу открыт;
-PHP4.4.9

А где ранее была ошибка?

Спустя 5 минут, 9 секунд (21.02.2009 - 19:09) Viking написал(а):
file_put_contents только в пхп5
PHP
<?php
$filename 
= "dostavka.php";


$basename='link.xml';
$all_count = file_get_contents($basename);
if (preg_match("/<ARTICLES>(.*)<\/ARTICLES>/ims", $all_count, $artic_count)){
    if (preg_match("/<FILE filename=\"$filename\">(.*)<\/FILE>/isU", $artic_count[1], $account)){//echo "yes";var_dump($account);
        $count=($account[1]+1);
        $all_count = preg_replace("/<FILE filename=\"$filename\">$account[1]<\/FILE>/","<FILE filename=\"$filename\">$count</FILE>",$all_count);

        $fl = fopen($basename,"w");
        fwrite($fl,$all_count);
        fclose($fl);
        $body_bot_text="<small>".$count."</small>";
    }else{
        $body_bot_text="<small>подгруппа не открыта</small>";
    }
}else{
        $body_bot_text="<small>группа не открыта</small>";
}

если и это не сработает - я пас, дальше совсем не интересно happy.gif

Спустя 3 минуты, 13 секунд (21.02.2009 - 19:12) kich написал(а):
Цитата (Viking @ 21.02.2009 - 19:52)
какая именно ошибка?
доступа на запись чтоли нет? или у тебя php4?
блин че за манера "ошибка возникает..." тема про телепатов уже подзадолбала

Подключил модуль PHP5.1.6 - и сразу все заработало biggrin.gif

Огромное спасибо, правда, вот еще один вопрос, какой лучше подуль подключать PHP5.1.6 или PHP5.2.8. И если я соберу php с xml, то какими функциями лучше пользоваться dom или вовсе на SimpleXML?

Спустя 4 минуты, 59 секунд (21.02.2009 - 19:17) Viking написал(а):
чем позднее версия, тем лучше
SimpleXML проще, дом универсальнее, если хочешь серьезно с этим делом работать, то я бы посоветовал дом

Спустя 1 минута, 44 секунды (21.02.2009 - 19:19) kich написал(а):
Цитата (Viking @ 21.02.2009 - 20:17)
чем позднее версия, тем лучше
SimpleXML проще, дом универсальнее, если хочешь серьезно с этим делом работать, то я бы посоветовал дом

а есть где нибудь в сети мануал на великом и могучем, а то я встречался только с америкосско-забугорным языком. Или хотяб какие нить интересные рессурсы

Спустя 2 минуты, 44 секунды (21.02.2009 - 19:21) kich написал(а):
Кстати, код полноценно заработал, когда я еще $count обнулил
PHP
$count=0;
$count=($account[1]+1);


Это я так добавил, как говориться для предков, чтоб по поиску народ чаще ответ находил и кричал, что ошибки проявляются

Спустя 6 минут, 1 секунда (21.02.2009 - 19:27) Viking написал(а):
http://ru.php.net/manual/ru/refs.xml.php вот самая главная, правда там далеко не все на велико-могучем, может еще где-то книжки есть

Спустя 2 минуты, 12 секунд (21.02.2009 - 19:30) Viking написал(а):
Цитата
$count=0;
$count=($account[1]+1);

ну вообще бессмысленно сначала ноль присваивать, а потом выражение, обычное
$count=$account[1]+1; - 100%-корректно

Спустя 25 минут, 5 секунд (21.02.2009 - 19:55) kich написал(а):
Цитата (Viking @ 21.02.2009 - 20:27)
http://ru.php.net/manual/ru/refs.xml.php вот самая главная, правда там далеко не все на велико-могучем, может еще где-то книжки есть

Там же все англоязычное

Спустя 1 день, 31 минута, 26 секунд (22.02.2009 - 20:26) kich написал(а):
Цитата (Viking @ 21.02.2009 - 20:17)
чем позднее версия, тем лучше
SimpleXML проще, дом универсальнее, если хочешь серьезно с этим делом работать, то я бы посоветовал дом

Слушай, а в какой программе ты работаешь с DOM технологией?

Спустя 49 минут, 11 секунд (22.02.2009 - 21:15) Viking написал(а):
Цитата
Слушай, а в какой программе ты работаешь с DOM технологией?

в смысле в какой программе работаю? blink.gif в какой программе код набираю чтоли? как все отставшие от цивилизации - в текстовом редакторе с подсветкой синтаксиса, ни о каких специальных программах не слышал, да и не за чем

Спустя 9 минут, 3 секунды (22.02.2009 - 21:24) kich написал(а):
Цитата (Viking @ 22.02.2009 - 22:15)
Цитата
Слушай, а в какой программе ты работаешь с DOM технологией?

в смысле в какой программе работаю? blink.gif в какой программе код набираю чтоли? как все отставшие от цивилизации - в текстовом редакторе с подсветкой синтаксиса, ни о каких специальных программах не слышал, да и не за чем

Да я тут просто начал DOM технологию изучать, пользуюсь тоже текстовым редактором с подсветкой синтекса, ака Notepad++
Начал смотреть код, который ты мне в этой теме ранее подкинул, посмотрел на них описание в функциях, попробовал написать код, ниче не получилось нормального.
Вот еще вопрос, у тя в коде дом-функции написаны как "getElementsByTagName", а в функциях она обозначается "get_elements_by_tagname" - зависит ли это от чего нить?

Спустя 4 минуты, 52 секунды (22.02.2009 - 21:29) Sylex написал(а):
меня тоже вопрос улыбнул biggrin.gif

Спустя 4 минуты, 17 секунд (22.02.2009 - 21:34) Viking написал(а):
это у тебя чего-то другое, видимо simpleXML или что-то еще
это совершенно разные вещи, моя вот оно http://ru.php.net/manual/ru/domdocument.ge...tsbytagname.php
это чистый дом, прелесть в том, что он сам по себе к пхп не привязан, и в javascript для него практически аналогичный синтаксис, но чтобы это изучить надо имхо с теории начинать, нужно именно структуру самой модели понимать
а simpleXML это именно пхпшная надстройка для упрощенной работы с xml

Спустя 1 день, 4 часа, 22 минуты, 31 секунда (24.02.2009 - 01:56) kich написал(а):
Цитата (Viking @ 22.02.2009 - 22:34)
это у тебя чего-то другое, видимо simpleXML или что-то еще
это совершенно разные вещи, моя вот оно http://ru.php.net/manual/ru/domdocument.ge...tsbytagname.php
это чистый дом, прелесть в том, что он сам по себе к пхп не привязан, и в javascript для него практически аналогичный синтаксис, но чтобы это изучить надо имхо с теории начинать, нужно именно структуру самой модели понимать
а simpleXML это именно пхпшная надстройка для упрощенной работы с xml

Спасибо за совет;)
Немного ясности внес вот этот материал http://phpclub.ru/faq/PHP5/XML?v=nnm

Так что, постепенно начинаю учить и юзать чистый DOM

А пока, доп-ой инфы по совместимости DOM с рнр (и тем более с пятой версией) ниче не нашел. Если есть у кого какие нить ссылки по этой теме, скиньте пжл

Спустя 1 год, 11 месяцев, 6 дней, 13 часов, 10 минут, 21 секунда (2.02.2011 - 15:06) cubasis написал(а):
Viking

Большое спасибо за помощь в написании скрипта на замену в xml мне тож ет очень пригодилось.


_____________
Быстрый ответ:

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