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

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

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

 

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

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

тема: Извлечь информации из HTML-файла при помощи регулярных выражений
 
 автор: ExtreMall   (10.01.2007 в 14:37)   письмо автору
 
 

Здраствуйте,
Как можно выдернуть информацию со странички, на которой расположена такая таблица:

<table cellspacing="1" cellpadding="2" border="0" style="font-size:10px; font-family:Tahoma;">
   <tr bgcolor="#657FAB" style="color:#FFFFFF; font-size:10px; font-weight:bold; font-family:Tahoma;">
      <td colspan="2" align="center">Символ</td>
      <td align="center">Значение 1</td>
      <td align="center">Значение 2</td>
   </tr>
   <tr bgcolor="#EAEBEE" class="text">
      <td><img src="img/down.gif" width="12" height="12"></div></td>
      <td width="50"><div class="down">EURUSD</td>
      <td width="40" align="right"><div class="down">1.2994</div></td>
      <td width="40" align="right"><div class="down">1.2996</div></td>
   </tr>
   <tr class="text">
      <td><img src="img/down.gif" width="12" height="12"></div></td>
      <td width="50"><div class="down">USDCHF</td>
      <td width="40" align="right"><div class="down">1.2419</div></td>
      <td width="40" align="right"><div class="down">1.2423</div></td>
   </tr>
   <tr bgcolor="#EAEBEE" class="text">
      <td><img src="img/down.gif" width="12" height="12"></div></td>
      <td width="50"><div class="down">USDJPY</td>
      <td width="40" align="right"><div class="down">119.18</div></td>
      <td width="40" align="right"><div class="down">119.21</div></td>
   </tr>
   <tr class="text">
      <td><img src="img/down.gif" width="12" height="12"></div></td>
      <td width="50"><div class="down">GBPUSD</td>
      <td width="40" align="right"><div class="down">1.9384</div></td>
      <td width="40" align="right"><div class="down">1.9388</div></td>
   </tr></table>

Из этой таблицы мне нужны цифры, расположенные в ячейках Значение 1 и Значение 2

Помогите пожалуйста, привидите какой нибудь пример, я попросту не имел с этим делов, и не знаю даже с какой стороны подойти :(

   
 
 автор: Гость   (10.01.2007 в 15:21)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 14:37)
 

не тестил
(<td align=\"center\">)+[.]*(</td>)+

   
 
 автор: ExtreMall   (10.01.2007 в 15:29)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 14:37)
 

И еще, как мне эти значения потом в переменные запихнуть, для дальнейшего отображения уже в другом месте?

Это правильно??


<? 
$stranica
'<table cellspacing="1" .. </td></tr></table> '
preg_match("<td align=\"center\">)+[.]*(</td>)+"$stranica$znach_1); 
echo 
$znach_1
?> 

   
 
 автор: ExtreMall   (10.01.2007 в 15:37)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 15:29)
 

Потестил что выше написал, у меня на страничке появляется только слово Array
Я сделал так:


...
echo $znach_1[1]; 
...


Но так, опять ничего не выводит, спасите :)

   
 
 автор: kasmanaft   (10.01.2007 в 16:00)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 15:37)
 

Попробуйте тек:

preg_match_all('#<td align="center">(.*?)</td>#s', $stranica, $znach_1);  
unset($znach_1[0]);
echo "<pre>";
print_r($znach_1);

   
 
 автор: ExtreMall   (10.01.2007 в 16:11)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 14:37)
 

Ничего не выходит, мужики, я наверное неправильно вопрос поставил, мне нужны значения из ячейки EURUSD, к нему привязаны два цифровых знач. - это (1.2994 и 1.2996), вот они то мне и нужны, но потом нужно их запихнуть в переменные, например такие eurusd_1 и eurusd_2 для дальнейшего использования.

Такое вообще возможно??

   
 
 автор: ExtreMall   (10.01.2007 в 16:53)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 14:37)
 

Вообщем сделал так, но здесь я убрал контейнеры <div></di> потому что не знаю как их обработать рег. выражениями, обьясните.

<?
$stranica 
'<table cellspacing="1" cellpadding="2" border="0" style="font-size:10px; font-family:Tahoma;"> 
   <tr bgcolor="#657FAB" style="color:#FFFFFF; font-size:10px; font-weight:bold; font-family:Tahoma;"> 
      <td colspan="2" align="center">Символ</td> 
      <td align="center">Значение 1</td> 
   </tr> 
   <tr bgcolor="#EAEBEE" class="text"> 
      <td><img src="img/down.gif" width="12" height="12"></div></td> 
      <td width="50"><div class="down">EURUSD</td> 
      <td width="40" align="right">1.2994</td> 
   </tr> 
   <tr class="text"> 
      <td><img src="img/down.gif" width="12" height="12"></div></td> 
      <td width="50"><div class="down">USDCHF</td> 
      <td width="40" align="right"><div class="down">1.2419</div></td> 
      <td width="40" align="right"><div class="down">1.2423</div></td> 
   </tr> 
   <tr bgcolor="#EAEBEE" class="text"> 
      <td><img src="img/down.gif" width="12" height="12"></div></td> 
      <td width="50"><div class="down">USDJPY</td> 
      <td width="40" align="right"><div class="down">119.18</div></td> 
      <td width="40" align="right"><div class="down">119.21</div></td> 
   </tr> 
   <tr class="text"> 
      <td><img src="img/down.gif" width="12" height="12"></div></td> 
      <td width="50"><div class="down">GBPUSD</td> 
      <td width="40" align="right"><div class="down">1.9384</div></td> 
      <td width="40" align="right"><div class="down">1.9388</div></td> 
   </tr></table>'
;
preg_match_all('#EURUSD</td>[^>]+>(.*?)</td>#s'$stranica$znach_1);   
unset(
$znach_1[0]); 
echo 
"<pre>"
print_r($znach_1);
?>


Вообщем результат сего следующий, на экран выводится вот что:
Array
(
[1] => Array
(
[0] => 1.2994
)

)

Т.е. значение то есть, но зачем эти скобки и все остальное вылазиет?

   
 
 автор: kasmanaft   (10.01.2007 в 17:08)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 16:53)
 

print_r выводит массив ... чтобы вывести конкретный элемент массива можно использовать

echo $znach_1[1][0];

   
 
 автор: Гость   (10.01.2007 в 17:21)   письмо автору
 
   для: kasmanaft   (10.01.2007 в 17:08)
 

Вот работает.

<?
if (preg_match("/((<td align=\"center\">){1})(.*)((<\/td> 
      <td align=\"center\">){1})(.*)((<\/td>){1})/i"
,$text,$result))
{
echo 
$result[3]."<br>".$result[6];
}
?>

   
 
 автор: гость   (10.01.2007 в 17:27)   письмо автору
 
   для: Гость   (10.01.2007 в 17:21)
 

PS: $text=этой форме.
Все разбивается на массивы в 3 - значение 1, в 6-ом - значение 2-ва.

   
 
 автор: ExtreMall   (10.01.2007 в 17:46)   письмо автору
 
   для: kasmanaft   (10.01.2007 в 17:08)
 

Спасибо kasmanaft , я попросту тока первый день в этом деле :-)
Теперь вот что:
1. Что отвечает в рег. выражения за то, чтобы не учитывалось вот это: <div class="down"> .. <div class="up">??

2. Значение 1.2994 я выдернул (вернее Вы :-)), но как выдернуть второе значение 1.2996, то которое в следующей ячейке??
Я попробовал так, но у меня ничего не вышло, опять прошу помощи

<?
$stranica 
'<table cellspacing="1" cellpadding="2" border="0" style="font-size:10px; font-family:Tahoma;">
   <tr bgcolor="#657FAB" style="color:#FFFFFF; font-size:10px; font-weight:bold; font-family:Tahoma;">
      <td colspan="2" align="center">Символ</td>
      <td align="center">Значение 1</td>
      <td align="center">Значение 2</td>
   </tr>
   <tr bgcolor="#EAEBEE" class="text">
      <td><img src="img/down.gif" width="12" height="12"></div></td>
      <td width="50"><div class="down">EURUSD</td> 
      <td width="40" align="right"><div class="down">1.2994</div></td> 
      <td width="40" align="right"><div class="up">1.2996</div></td> 
   </tr>
   <tr class="text">
      <td><img src="img/down.gif" width="12" height="12"></div></td> 
      <td width="50"><div class="down">USDCHF</td> 
      <td width="40" align="right"><div class="up">1.2419</div></td> 
      <td width="40" align="right"><div class="down">1.2423</div></td> 
   </tr></tr></table>'
;
preg_match_all('#EURUSD</td>[^>]+>(.*?)</td>#s'$stranica$EURUSD_1);
unset(
$EURUSD_1[0]); 
echo 
"<pre>"
echo 
$EURUSD_1[1][0];
preg_match_all('#EURUSD</td><td width="40" align="right"></td>[^>]+>(.*?)</td>#s'$stranica$EURUSD_2);
unset(
$EURUSD_2[0]); 
echo 
"<pre>"
echo 
$EURUSD_2[1][0];
?>

   
 
 автор: Гость   (10.01.2007 в 17:55)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 17:46)
 

.

   
 
 автор: ExtreMall   (10.01.2007 в 18:10)   письмо автору
 
   для: Гость   (10.01.2007 в 17:55)
 

Да большое спасибо, но наверное вы меня не так поняли, вернее я не так вопрос поставил сразу :-(

Вообщем так, мне нужно выдернуть отсюда два числа (тут это: 1.2961 и 1.2963),
==============================================================
<td width="50"><div class="down">EURUSD</td> |
<td width="40" align="right"><div class="down">1.2961</div></td> |
<td width="40" align="right"><div class="down">1.2963</div></td> |
==============================================================
заведомо неизвестных, но так чтобы они в соотвествии с символом находились в таких переменных: $EURUSD_1 и $EURUSD_2, т.е.: $EURUSD_1=1.2961, а $EURUSD_2=1.2963
и так далее со всеми символами (я просто сократил табличку), дальше идет USDCHF, с ним нужно проделать тоже самое USDCHF_1=1.2448, а USDCHF_2=1.2452, но это я уже сам сделал бы, мне бы только с первым разобратся, а дальше надеюсь пойму.

<table cellspacing="1" cellpadding="2" border="0" style="font-size:10px; font-family:Tahoma, Arial, Helvetica, sans-serif;">
   <tr bgcolor="#657FAB" style="color:#FFFFFF; font-size:10px; font-weight:bold; font-family:Tahoma, Arial, Helvetica, sans-serif;">
      <td colspan="2" align="center">Symbol</td>
      <td align="center">Bid</td>
      <td align="center">Ask</td>
   </tr>
   <tr bgcolor="#EAEBEE" class="text">
      <td><img src="img/down.gif" width="12" height="12"></div></td>
      <td width="50"><div class="down">EURUSD</td>
      <td width="40" align="right"><div class="down">1.2961</div></td>
      <td width="40" align="right"><div class="down">1.2963</div></td>
   </tr>
   <tr class="text">
      <td><img src="img/down.gif" width="12" height="12"></div></td>
      <td width="50"><div class="down">USDCHF</td>
      <td width="40" align="right"><div class="down">1.2448</div></td>
      <td width="40" align="right"><div class="down">1.2452</div></td>
   </tr></td></table>

   
 
 автор: Гость   (10.01.2007 в 18:36)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 18:10)
 

да, я просто не так понял :). вообщем выражение должно выглядеть как-то так:
"/.*(<div class=\"down\">){1}(.*)(<\/div>){1}.*/i"
это для первого.. видимо его надо просто надставить раз 7-мь (по кол-ву значений) но это некрасиво :).или ..
О можно еще так :
ищем это значение, получаем, зачем с помошью рег. выражения затираем это место, и в цикл это :), ужасть, если что могу написатЬ, но завтра :), а я думаю до этого момента придложат более элегантное решение :)

   
 
 автор: ExtreMall   (10.01.2007 в 18:47)   письмо автору
 
   для: Гость   (10.01.2007 в 18:36)
 

Гость если не сложно то пожалуйста напишите, я подожду.

   
 
 автор: ExtreMall   (10.01.2007 в 19:28)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 18:10)
 

Ну помогите кто нибудь а

   
 
 автор: kasmanaft   (10.01.2007 в 20:22)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 19:28)
 

Можно наверное таким выражением обработать текст и потом уже работать с массивом:

#<div[^>]*>([^<]+)#s

Получим массив

Array
(
    [1] => Array
        (
            [0] => EURUSD
            [1] => 1.2994
            [2] => 1.2996
            [3] => USDCHF
            [4] => 1.2419
            [5] => 1.2423
            [6] => USDJPY
            [7] => 119.18
            [8] => 119.21
            [9] => GBPUSD
            [10] => 1.9384
            [11] => 1.9388
        )
)

Или же можно разбить текст на 4 куска и обрабатывать их по отдельности в цикле ... Но этот вариант по-моему лучше.

   
 
 автор: Trianon   (10.01.2007 в 20:41)   письмо автору
 
   для: kasmanaft   (10.01.2007 в 20:22)
 


$ptn = '#<div[^>]*>([A-Z]+)[^=]+=[^<]+<div[^>]*>([.0-9]+)[^=]+=[^<]+<div[^>]*>([.0-9]+)#s';

$res = preg_match_all($ptn, $x, $out, PREG_SET_ORDER);

foreach($out as $key => $val) unset($out[$key][0]);
echo '<pre>';
print_r($out);



Array
(
    [0] => Array
        (
            [1] => EURUSD
            [2] => 1.2961
            [3] => 1.2963
        )

    [1] => Array
        (
            [1] => USDCHF
            [2] => 1.2448
            [3] => 1.2452
        )

)

   
 
 автор: ExtreMall   (10.01.2007 в 23:25)   письмо автору
 
   для: Trianon   (10.01.2007 в 20:41)
 

Trianon, этого я и добиваюсь, спасибо Вам
я сделал так, но почему то ничего не появляется совсем!!


<? php
$x 
'<table cellspacing="1" cellpadding="2" border="0" style="font-size:10px; font-family:Tahoma, Arial, Helvetica, sans-serif;"> 
   <tr bgcolor="#657FAB" style="color:#FFFFFF; font-size:10px; font-weight:bold; font-family:Tahoma, Arial, Helvetica, sans-serif;"> 
      <td colspan="2" align="center">Symbol</td> 
      <td align="center">Bid</td> 
      <td align="center">Ask</td> 
   </tr> 
   <tr bgcolor="#EAEBEE" class="text"> 
      <td><img src="img/down.gif" width="12" height="12"></div></td> 
      <td width="50"><div class="down">EURUSD</td> 
      <td width="40" align="right"><div class="down">1.2961</div></td> 
      <td width="40" align="right"><div class="down">1.2963</div></td> 
   </tr> 
   <tr class="text"> 
      <td><img src="img/down.gif" width="12" height="12"></div></td> 
      <td width="50"><div class="down">USDCHF</td> 
      <td width="40" align="right"><div class="down">1.2448</div></td> 
      <td width="40" align="right"><div class="down">1.2452</div></td> 
   </tr></td></table> '

$ptn '#<div[^>]*>([A-Z]+)[^=]+=[^<]+<div[^>]*>([.0-9]+)[^=]+=[^<]+<div[^>]*>([.0-9]+)#s'
$res preg_match_all($ptn$x$outPREG_SET_ORDER); 
foreach(
$out as $key => $val) unset($out[$key][0]); 
echo 
'<pre>'
print_r($out); 
?>


Где ошибка?

   
 
 автор: Trianon   (10.01.2007 в 23:54)   письмо автору
 
   для: ExtreMall   (10.01.2007 в 23:25)
 

Что значит пробел в первой строке?


<? php 

   
 
 автор: ExtreMall   (11.01.2007 в 03:35)   письмо автору
 
   для: Trianon   (10.01.2007 в 23:54)
 

Спасибо, совсем уже ослеп :-)
Все работает, спасибо ВСЕМ!!

   
Rambler's Top100
вверх

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