Проблема с регулярными выражениями

ruskam

Новичок
Проблема с регулярными выражениями

есть исходная строка
$ss='USD</td><td class="smallFont" width="34%">4.980 / 5.040</td><td class="smallFont" width="33%">5.05</td>';
Задача состоит в том, чтобы с помощью регулярных выражений из этой строки выделить вот эти числа 4.980 / 5.040 (которые могут менять значения - это курсы валют)вместе со знаком /.
Так вот при таком запросе $pattern='|USD<\/td><td class\=\"smallFont\" width\=\"34%\">(\d{1}\.\d{3})|'; первое число 4.980 выделяется отлично.
А вот при таком запросе $pattern='|<\/td><td class\=\"smallFont\" width\=\"34%\">(\d{1}\.\d{3})\s\/\s(\d{1}\.\d{3})<\/td>|'; уже ничего вообще не выделяется....
где ошибка ? Подскажите пожалуйста...
 

python

Новичок
Странно... У меня код
PHP:
<?php
$ss='USD</td><td class="smallFont" width="34%">4.980 / 5.040</td><td class="smallFont" width="33%">5.05</td>';

$pattern1='|USD<\/td><td class\=\"smallFont\" width\=\"34%\">(\d{1}\.\d{3})|';
$pattern2='|<\/td><td class\=\"smallFont\" width\=\"34%\">(\d{1}\.\d{3})\s\/\s(\d{1}\.\d{3})<\/td>|';
echo "Pattern1:";
preg_match($pattern1, $ss, $matches);
print_r($matches);
echo "<br\n>Pattern2:";
preg_match($pattern2, $ss, $matches);
print_r($matches);
?>
как и ожидалось выдал:
Pattern1:Array ( [0] => USD4.980 [1] => 4.980 )
Pattern2:Array ( [0] => 4.980 / 5.040 [1] => 4.980 [2] => 5.040 )

Как ты "выделяешь" вхождения?
 

Anarki

Новичок
Re: Проблема с регулярными выражениями

Автор оригинала: ruskam
есть исходная строка
$ss='USD</td><td class="smallFont" width="34%">4.980 / 5.040</td><td class="smallFont" width="33%">5.05</td>';
Задача состоит в том, чтобы с помощью регулярных выражений из этой строки выделить вот эти числа 4.980 / 5.040 (которые могут менять значения - это курсы валют)вместе со знаком /.
Если используешь альтернативные ограничители, то нет смысла экранировать слеши ("/").
 

ruskam

Новичок
странно у меня тоже заработало, но ...
а почему, если переменую $ss заменить на
$ss=file_get_contents("http://www.aval.ua/eng/");

то уже не работает...хотя строчка в точности взята из этой страницы...проверял 3 раза....По сути это одно и тоже....кодировка вроде подходит вынь1251
Выдаёт:
Pattern1:Array ( )
Pattern2:Array ( ) //echo $ss;

-~{}~ 30.08.05 16:42:

Автор оригинала: python
Странно... У меня код
PHP:
<?php
$ss='USD</td><td class="smallFont" width="34%">4.980 / 5.040</td><td class="smallFont" width="33%">5.05</td>';

$pattern1='|USD<\/td><td class\=\"smallFont\" width\=\"34%\">(\d{1}\.\d{3})|';
$pattern2='|<\/td><td class\=\"smallFont\" width\=\"34%\">(\d{1}\.\d{3})\s\/\s(\d{1}\.\d{3})<\/td>|';
echo "Pattern1:";
preg_match($pattern1, $ss, $matches);
print_r($matches);
echo "<br\n>Pattern2:";
preg_match($pattern2, $ss, $matches);
print_r($matches);
?>
как и ожидалось выдал:
Pattern1:Array ( [0] => USD4.980 [1] => 4.980 )
Pattern2:Array ( [0] => 4.980 / 5.040 [1] => 4.980 [2] => 5.040 )

Как ты "выделяешь" вхождения?
Что значит вхождения ? Если это то, что должено остаться и запомниться то круглыми скобками ()
 

python

Новичок
$ss=file_get_contents("http://www.aval.ua/eng/");
у меня работает аналогично, попробуй error_reporting(E_ALL), может адрес недоступен.

причем здесь Вынь1251, ты же по аглицки строку ищещь
 

ruskam

Новичок
Автор оригинала: python
$ss=file_get_contents("http://www.aval.ua/eng/");
у меня работает аналогично, попробуй error_reporting(E_ALL), может адрес недоступен.

причем здесь Вынь1251, ты же по аглицки строку ищещь
О виноват....была одна ошибка....сейчас выводит токо патерн1.... как и было изначально....мистика....
http://rus.real.ua/kurs.php - тут можно наблюдать
 

python

Новичок
в данном случае это не имеет отношения к локали

то есть если перед
PHP:
echo "Pattern1:";
сделать
PHP:
echo $ss
, то видишь правильный сайт а ниже
Pattern1:Array ( )
Pattern2:Array ( )
?

Снимаю, не видел предыдущего сообщения. А вообще непонятно, то работает, то не работает.
 

ruskam

Новичок
М....жаль что нет идей...
чтоже делать-то....
код так и не работает....
 

ruskam

Новичок
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Untitled Document</title>
</head>
<body>
<?
$ss=file_get_contents("http://www.aval.ua/eng/");
$pattern1='|USD<\/td><td class\=\"smallFont\" width\=\"34%\">(\d{1}\.\d{3})|';
$pattern2='|USD<\/td><td class\=\"smallFont\" width\=\"34%\">(\d{1}\.\d{3})\s\/\s(\d{1}\.\d{3})<\/td>|';
echo "Pattern1:";
preg_match($pattern1, $ss, $matches);
print_r($matches);
echo "<br\n>Pattern2:";
preg_match($pattern2, $ss, $matches);
print_r($matches);
?>
</body>
</html>

------------------
результат этого кода можно наблюдать по этой ссылке http://rus.real.ua/kurs.php
 

crocodile2u

http://vbolshov.org.ru
Курсы валют часто представлены на официальных ресурсах крупных банков в виде XML и доступны бесплатно. Это гораздо удобнее, нежели парсить HTML, который вдобавок, скорее всего, чаще будет менять свой вид, чем XML.
 

ruskam

Новичок
Автор оригинала: crocodile2u
Курсы валют часто представлены на официальных ресурсах крупных банков в виде XML и доступны бесплатно. Это гораздо удобнее, нежели парсить HTML, который вдобавок, скорее всего, чаще будет менять свой вид, чем XML.
Тут вопрос не в том где легче брать...А в том почему не работает код !!! Если с этим примером не разберуть, то подобное будет и с другими случаями, разве это не понятно....
 

magrish

Новичок
Проблемма в том, что в строке
4.980 / 5.030
После числа 4.980 стоит не пробельный символ, а
символ с кодом A0
Вырезать надо не (\d{1}\.\d{3})\s\/\s(\d{1}\.\d{3})
а
(\d{1}\.\d{3}).\/\s(\d{1}\.\d{3})
 

ruskam

Новичок
Автор оригинала: magrish
Проблемма в том, что в строке
4.980 / 5.030
После числа 4.980 стоит не пробельный символ, а
символ с кодом A0
Вырезать надо не (\d{1}\.\d{3})\s\/\s(\d{1}\.\d{3})
а
(\d{1}\.\d{3}).\/\s(\d{1}\.\d{3})
--------------
Супер....действительно не пробел...ВОТ СПАСИБО...:)
а как ты определил, что не пробел-то ???? а то не хочу попасть на эти грабли второй раз
 

magrish

Новичок
Открыл в редакторе код страницы и посмотрел коды символов.
 
Сверху