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

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

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

 

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

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

тема: Помогите составить регулярные выражения проверки типа таблицы курсов валют
 
 автор: pavluxa09   (03.01.2010 в 17:59)   письмо автору
 
 

Здравствуйте. Помогите составить блок if'ов с регулярными выражениями которые будут проверять какой тип таблицы курса используется. Имеется переменная $t в которой хранится таблица курсов. Все стандартны таблиц тут http://estandards.ru/index.php?title=%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BE%D1%80%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0_%D1%81_%D0%BA%D1%83%D1%80%D1%81%D0%B0%D0%BC%D0%B8_%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D1%83%D0%BD%D0%BA%D1%82%D0%B0.

То есть нужно проверить: Если в переменной $t структура данных следующая:
<rates>
<item>
<from>*</from>
<to>*</to>
<in>*</in>
<out>*</out>
<amount>*</amount>
</item>
то вывести XML, а если *;*;*;*;* то TXT

  Ответить  
 
 автор: cheops   (03.01.2010 в 19:04)   письмо автору
 
   для: pavluxa09   (03.01.2010 в 17:59)
 

Хм... может просто проверить существование подстроки "<rates>"?
<?php
  
if(strpos($t"<rates>") !== false) echo "XML";
  else echo 
"TXT";
?>

  Ответить  
 
 автор: pavluxa09   (03.01.2010 в 20:04)   письмо автору
 
   для: cheops   (03.01.2010 в 19:04)
 

нето

  Ответить  
 
 автор: cheops   (03.01.2010 в 20:43)   письмо автору
 
   для: pavluxa09   (03.01.2010 в 20:04)
 

Тогда необходимо уточнение критериев проверки.

  Ответить  
 
 автор: pavluxa09   (04.01.2010 в 10:10)   письмо автору
 
   для: cheops   (03.01.2010 в 20:43)
 

1. Если это таблица XML тогда в ней должны открываться и закрываться теги: <rates> <item> <from> <to> <in> <out> <amount>, а также между тегами <in> <out> <amount> должно быть число (целое или дробное через точку). Таблица XML может иметь свой вид следующий:

<rates>
<item>
<from>Webmoney USD</from>
<to>Webmoney RUB</to>
<in>1</in>
<out>23.628812</out>
<amount>10000.23</amount>
</item>

<item>
<from>WMZ</from>
<to>WMR</to>
<in>1</in>
<out>23.628812</out>
<amount>10000.23</amount>
</item>

<item>
<from>001</from>
<to>002</to>
<in>1</in>
<out>23.628812</out>
<amount>10000.23</amount>
</item>
</rates>


2. Если это таблица типа TXT, тогда в ней обязательно должно быть в каждой строке следующая структура *;*;*;*;*
Место трёх последних звёздачек может быть число (целое или дробное через точку). А место двух первых символы(до 12 возможно с пробелом). Таблица такого типа может иметь следующий вид:

Webmoney USD;Webmoney RUB;1;23.628812;10000.23
WMZ;WMR;1;23.628812;10000.23
 001;002;1;23.628812;10000.23


3. Если таблица типа TXT2, тогда в ней должно быть в каждой строке следующая структура: Валюта -> Валюта2: rate=число, reserve=число
Там числа целые или дробные с точкой.
Таблица такого типа может иметь следующий вид:

WebMoney USD -> WebMoney RUR: rate=0.0333960065055, reserve=0
WMZ -> WMR: rate=1.44143, reserve=0
0001 -> 002: rate=0.0191799420155, reserve=0


4. Если таблицы типа TXT3, тогда в ней в каждой строке должна быть следующая структура: *,*,*,*;
Где место первых двух звёздочек может быть валюта, а место последних двух число (целое или дробное через точку). Пример такой таблицы:

1,2,0.0333960065055,0;
1,3,1.44143,0;
1,20,0.0191799420155,0;
1,19 ,0.000420841767704,0;
1,18,0.000356120283187,0;
1,21,37.233945,0;
2,1,32.4672,0;
2,3,44.6664,0;
2,20,3.98371,0;

  Ответить  
 
 автор: cheops   (04.01.2010 в 14:31)   письмо автору
 
   для: pavluxa09   (04.01.2010 в 10:10)
 

1. Можно отталкиваться от следующего скрипта
<?php 
  $text 
"<rates> 
<item> 
<from>Webmoney USD</from> 
<to>Webmoney RUB</to> 
<in>1</in> 
<out>23.628812</out> 
<amount>10000.23</amount> 
</item> 

<item> 
<from>WMZ</from> 
<to>WMR</to> 
<in>1</in> 
<out>23.628812</out> 
<amount>10000.23</amount> 
</item> 

<item> 
<from>001</from> 
<to>002</to> 
<in>1</in> 
<out>23.628812</out> 
<amount>10000.23</amount> 
</item> 
</rates>"
;
  
$pattern "|<rates>([\s]*<item>".
             
"[\s]*<from>(.*?)</from>[\s]*".
             
"[\s]*<to>(.*?)</to>[\s]*".
             
"[\s]*<in>([\d.]*?)</in>[\s]*".
             
"[\s]*<out>([\d.]*?)</out>[\s]*".
             
"[\s]*<amount>([\d.]*?)</amount>[\s]*".
             
"</item>[\s]*)+</rates>|is";
  if(
preg_match($pattern$text)) echo "Это XML-файл";
  else echo 
"Это не XML-файл";
?>

  Ответить  
 
 автор: cheops   (04.01.2010 в 14:35)   письмо автору
 
   для: pavluxa09   (04.01.2010 в 10:10)
 

2. Можно отталкиваться от следующего скрипта
<?php 
  $text 
"Webmoney USD;Webmoney RUB;1;23.628812;10000.23 
WMZ;WMR;1;23.628812;10000.23 
001;002;1;23.628812;10000.23"
;
  
$pattern "#(.*?);(.*?);([\d.]*?);([\d.]*?);([\d.]*?)([\s]+|$)#is";
  if(
preg_match($pattern$text)) echo "Это CSV-файл";
  else echo 
"Это не CSV-файл";
?>

  Ответить  
 
 автор: cheops   (04.01.2010 в 14:38)   письмо автору
 
   для: pavluxa09   (04.01.2010 в 10:10)
 

4. Можно отталкиваться от следующего скрипта
<?php 
  $text 
"1,2,0.0333960065055,0; 
1,3,1.44143,0; 
1,20,0.0191799420155,0; 
1,19 ,0.000420841767704,0; 
1,18,0.000356120283187,0; 
1,21,37.233945,0; 
2,1,32.4672,0; 
2,3,44.6664,0; 
2,20,3.98371,0;"
;
  
$pattern "#([\d\s]*?),([\d\s]*?),([\d.]*?),([\d.]*?);#is";
  if(
preg_match($pattern$text)) echo "Это TXT3-файл";
  else echo 
"Это не TXT3-файл";
?>

  Ответить  
 
 автор: cheops   (04.01.2010 в 14:43)   письмо автору
 
   для: pavluxa09   (04.01.2010 в 10:10)
 

3. Можно отталкиваться от следующего скрипта
<?php 
  $text 
"WebMoney USD -> WebMoney RUR: rate=0.0333960065055, reserve=0 
WMZ -> WMR: rate=1.44143, reserve=0 
0001 -> 002: rate=0.0191799420155, reserve=0"
;
  
$pattern "#(.*?)->(.*?):[\s]*rate=[\d.]+,[\s]*reserve=[\d.]*#is";
  if(
preg_match($pattern$text)) echo "Это TXT2-файл";
  else echo 
"Это не TXT2-файл";
?>

  Ответить  
 
 автор: pavluxa09   (04.01.2010 в 18:35)   письмо автору
 
   для: cheops   (04.01.2010 в 14:43)
 

Большое спасибо. То что я хотел. Чуть попоже проверю и скажу результат!

  Ответить  
 
 автор: pavluxa09   (04.01.2010 в 19:12)   письмо автору
 
   для: pavluxa09   (04.01.2010 в 18:35)
 

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

  Ответить  
 
 автор: cheops   (04.01.2010 в 20:23)   письмо автору
 
   для: pavluxa09   (04.01.2010 в 19:12)
 

После проверки вместо
<?php
 
if(preg_match($pattern$text)) echo "Это XML-файл";
?>

Подставляйте
<?php
  preg_match_all
($pattern$text$out);
?>

$out - будет содержать многомерный массив, элементами которого будут выступать фрагменты, соответствующие круглым скобкам регулярного выражения.

  Ответить  
 
 автор: pavluxa09   (05.01.2010 в 09:01)   письмо автору
 
   для: cheops   (04.01.2010 в 20:23)
 

В результате работы мы получаем следующий массив:
(
[0] => Array
(
[0] => <rates>

<item><from>Webmoney USD</from><to>Webmoney RUB</to><in>1</in><out>29.9439</out><amount>0</amount></item>
<item><from>Webmoney USD</from><to>Webmoney EUR</to><in>1.44992</in><out>1</out><amount>0</amount></item>
<item><from>Webmoney USD</from><to>Webmoney UAH</to><in>1</in><out>-51.9407939998</out><amount>0</amount></item>

<item><from>Webmoney USD</from><to>Webmoney UZS</to><in>1</in><out>2371.69</out><amount>0</amount></item>
<item><from>Webmoney USD</from><to>Webmoney BYR</to><in>1</in><out>2797.22</out><amount>0</amount></item>
<item><from>Webmoney USD</from><to>Webmoney Gold</to><in>37.233945</in><out>1</out><amount>0</amount></item>

<item><from>Webmoney RUB</from><to>Webmoney USD</to><in>32.258</in><out>1</out><amount>0</amount></item>
<item><from>Webmoney RUB</from><to>Webmoney EUR</to><in>44.7498</in><out>1</out><amount>0</amount></item>
<item><from>Webmoney RUB</from><to>Webmoney UAH</to><in>3.9788</in><out>1</out><amount>0</amount></item>

</rates>
)

[1] => Array
(
[0] => <item><from>Webmoney RUB</from><to>Webmoney UAH</to><in>3.9788</in><out>1</out><amount>0</amount></item>

)

[2] => Array
(
[0] => Webmoney RUB
)

[3] => Array
(
[0] => Webmoney UAH
)

[4] => Array
(
[0] => 3.9788
)

[5] => Array
(
[0] => 1
)

[6] => Array
(
[0] => 0
)

)
В нём только раскрывается значение первой строки, а нужно всех.
Что делать?

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

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