Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите с парсером конфига
 
 автор: adminn   (20.11.2009 в 04:27)   письмо автору
 
 

Добрый день.
Только начинаю изучать пхп по самоучителям , книгам с softtime.ru , пока мало знаю , так , что не пинать.
Подскажите , как мне написать парсер для конфига т.е есть тхт файл такого вида:
<VirtualHost 80.87.128.33:80>
# RlimitCPU is amount of actual CPU time allowed per process max.
RLimitCPU 100 100
#Limit of 64Mb memory per process
RLimitMEM 65216000
User procedis
Group procedis
SetEnv QMAILUSER postmaster
SetEnv QMAILHOST errvin.info
ServerAdmin webmaster@errvin.info
DocumentRoot /home/procedis/public_html
ServerName www.errvin.info
ServerAlias errvin.info procedis.boson.posiweb.net procedis.com www.procedis.com
CustomLog /home/procedis/logs/access_log combined
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html
</VirtualHost>


Мне нужно выбрать все домена т.е все , что идет после ServerName и сохранить в пхп , кода там на 10 строчек , не совсем понимаю еще как это делается , помогите примерчиком , заранее спасибо!

  Ответить  
 
 автор: cheops   (20.11.2009 в 13:30)   письмо автору
 
   для: adminn   (20.11.2009 в 04:27)
 

Можно воспользоваться регулярными выражениями
<?php 
$text 
"<VirtualHost 80.87.128.33:80> 
# RlimitCPU is amount of actual CPU time allowed per process max. 
RLimitCPU 100 100 
#Limit of 64Mb memory per process 
RLimitMEM 65216000 
User procedis 
Group procedis 
SetEnv QMAILUSER postmaster 
SetEnv QMAILHOST errvin.info 
ServerAdmin webmaster@errvin.info 
DocumentRoot /home/procedis/public_html 
ServerName www.errvin.info 
ServerAlias errvin.info procedis.boson.posiweb.net procedis.com www.procedis.com 
CustomLog /home/procedis/logs/access_log combined 
ErrorDocument 404 /404.html 
ErrorDocument 403 /403.html 
</VirtualHost>"
;

preg_match_all('/ServerName[\s]([^\s]+)\b/'$text$out);
echo 
"<pre>";
print_r($out[1]);
echo 
"</pre>";
?>

  Ответить  
 
 автор: adminn   (21.11.2009 в 02:00)   письмо автору
 
   для: cheops   (20.11.2009 в 13:30)
 

загнал в переменную весь конфиг , выводит пустую страницу( подскажите?

  Ответить  
 
 автор: heed   (21.11.2009 в 02:45)   письмо автору
 
   для: adminn   (21.11.2009 в 02:00)
 

Вообще такие конфиги сделаны так что их приложения разбирают построчно
, похоже на чтение файлов fgets();
<?php
$handle 
= @fopen("/tmp/inputfile.txt""r");
if (
$handle) {
    while (!
feof($handle)) {
        
$buffer fgets($handle4096);
        echo 
$buffer;
    }
    
fclose($handle);
}
?> 
только в цикле будет что-то типа switch с проверкой и разделением строки
, что-то не соображу возможно-ли как-нибудь применить sscanf()
А так выражениями и правда наверное попросще.
, похоже лучше сделать ещё проверку на начало строки, чтобы не зацепить чего из комментариев
, и наверное просто пробелов после ключевого слова было больше
'/^\s*ServerName\s+(\S+)/m'

  Ответить  
 
 автор: adminn   (21.11.2009 в 04:44)   письмо автору
 
   для: heed   (21.11.2009 в 02:45)
 

не совсем понятно , можно пример? пытаюсь , то ерроры , то пустой вывод(

  Ответить  
 
 автор: cheops   (21.11.2009 в 12:19)   письмо автору
 
   для: adminn   (21.11.2009 в 02:00)
 

А если переменную вывести/или размер переменной - в ней точно имеется конфигурационный файл?

  Ответить  
 
 автор: adminn   (21.11.2009 в 16:20)   письмо автору
 
   для: cheops   (21.11.2009 в 12:19)
 

Спасибо тебе за помощь!
Вопрос твой не свовсем понял , у меня такой вид получился , выводит пустую страницу , может из за проблелов?
<?php 
$text 
"<VirtualHost 80.87.128.33:80> 
# RlimitCPU is amount of actual CPU time allowed per process max. 
RLimitCPU 100 100 
#Limit of 64Mb memory per process 
RLimitMEM 65216000 
User procedis 
Group procedis 
SetEnv QMAILUSER postmaster 
SetEnv QMAILHOST errvin.info 
ServerAdmin webmaster@errvin.info 
DocumentRoot /home/procedis/public_html 
ServerName www.errvin.info 
ServerAlias errvin.info procedis.boson.posiweb.net procedis.com www.procedis.com 
CustomLog /home/procedis/logs/access_log combined 
ErrorDocument 404 /404.html 
ErrorDocument 403 /403.html 
</VirtualHost>

<VirtualHost 80.87.128.33:80> 
# RlimitCPU is amount of actual CPU time allowed per process max. 
RLimitCPU 100 100 
#Limit of 64Mb memory per process 
RLimitMEM 65216000 
User procedis 
Group procedis 
SetEnv QMAILUSER postmaster 
SetEnv QMAILHOST errvin.info 
ServerAdmin webmaster@errvin.info 
DocumentRoot /home/procedis/public_html 
ServerName www.errvin.info 
ServerAlias errvin.info procedis.boson.posiweb.net procedis.com www.procedis.com 
CustomLog /home/procedis/logs/access_log combined 
ErrorDocument 404 /404.html 
ErrorDocument 403 /403.html 
</VirtualHost>

<VirtualHost 80.87.128.33:80> 
# RlimitCPU is amount of actual CPU time allowed per process max. 
RLimitCPU 100 100 
#Limit of 64Mb memory per process 
RLimitMEM 65216000 
User procedis 
Group procedis 
SetEnv QMAILUSER postmaster 
SetEnv QMAILHOST errvin.info 
ServerAdmin webmaster@errvin.info 
DocumentRoot /home/procedis/public_html 
ServerName www.errvin.info 
ServerAlias errvin.info procedis.boson.posiweb.net procedis.com www.procedis.com 
CustomLog /home/procedis/logs/access_log combined 
ErrorDocument 404 /404.html 
ErrorDocument 403 /403.html 
</VirtualHost>"
;

preg_match_all('/ServerName[\s]([^\s]+)\b/'$text$out);
echo 
"<pre>";
print_r($out[1]);
echo 
"</pre>";
?> 

  Ответить  
 
 автор: cheops   (21.11.2009 в 18:45)   письмо автору
 
   для: adminn   (21.11.2009 в 16:20)
 

Странно... у меня этот скрипт работает (выдает три позиции)... попробуйте изменить регулярное выражение на следующее
'/ServerName[\s]+([^\s]+)\b/'

  Ответить  
 
 автор: adminn   (22.11.2009 в 20:48)   письмо автору
 
   для: cheops   (21.11.2009 в 18:45)
 

Огромное спасибо! разобрался работает!
Только вот выводит в масиве такого вида:
(
    [0] => www.errvin.info
    [1] => www.errvin.info
    [2] => www.errvin.info
)

а мне нужно привести список к виду:
www.errvin.info
www.errvin.info
www.errvin.info
Подскажите , а то не могу начать работать(

  Ответить  
 
 автор: Trianon   (22.11.2009 в 21:05)   письмо автору
 
   для: adminn   (22.11.2009 в 20:48)
 

а в чем разница?

  Ответить  
 
 автор: adminn   (22.11.2009 в 21:52)   письмо автору
 
   для: Trianon   (22.11.2009 в 21:05)
 

там конфиг около 1000 сайтов , мне нужно привести его в рабочий вид , я же не могу сидеть и удалять [0] => и т.п подскажите как вывести только результат?

  Ответить  
 
 автор: Trianon   (22.11.2009 в 23:12)   письмо автору
 
   для: adminn   (22.11.2009 в 21:52)
 

а кто Вас заставляет в рабочем коде использовать print_r ?
print_r нужна для отладки и демонстрации - но никак не для работы.
выводите элемнты массива по одному в цикле.

  Ответить  
 
 автор: adminn   (23.11.2009 в 02:02)   письмо автору
 
   для: Trianon   (22.11.2009 в 23:12)
 

почитал еще у вас в доках , написал все как хотел , проверил, работает! только вот если я загоняю весь конфиг , он большо, то получаю пустой результат , подскажите?

  Ответить  
 
 автор: adminn   (23.11.2009 в 02:35)   письмо автору
 
   для: adminn   (23.11.2009 в 02:02)
 

del

  Ответить  
 
 автор: adminn   (23.11.2009 в 03:10)   письмо автору
 
   для: Trianon   (22.11.2009 в 23:12)
 

Что не так делаю, результат получаю весь файл(
set_time_limit(300);

$file = fopen("config.txt","r");
  
  if(!file)
{
      echo("Ошибка открытия файла");
}
      else  {

$text == fpassthru($file);

preg_match_all('/ServerName[\s]([^\s]+)\b/', $text, $out);

for ($i=0; $i< count($out[0]); $i++) {

  echo "<pre>";
  echo $out[1][$i] . "\n";
  echo "<pre>";


   
}

  Ответить  
 
 автор: cheops   (23.11.2009 в 12:49)   письмо автору
 
   для: adminn   (23.11.2009 в 03:10)
 

fpassthru() выводит содержимое файла в окно браузера, лучше воспользоваться функцией file_get_contents()
<?php
$text 
file_get_contents($file); 
preg_match_all('/ServerName[\s]([^\s]+)\b/'$text$out); 

for (
$i=0$icount($out[0]); $i++) { 
  echo 
$out[1][$i] . "<br>"

?>

  Ответить  
 
 автор: Trianon   (23.11.2009 в 15:04)   письмо автору
 
   для: adminn   (23.11.2009 в 03:10)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования