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

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

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

 

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

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

тема: Сложный поиск цены
 
 автор: Слух   (15.01.2010 в 12:32)   письмо автору
 
 

В тексте могут быть разные варианты цены, как правильно написать выражение чтобы выбрать часть с ценой(цифрами) и рублями. Я понимаю как правильно указать что нужно, но нехватает опыта работы с регулярками. И самое главное, как указать диапазон. Сейчас объясню.

<?
$example
[] = 'от 3 555 000 руб.  до 5 915 000 руб.';
$example[] = 'можно купить за 555 000 руб. или 15 000 руб.';
$example[] = ', 1 000 руб.';
$example[] = '<br/>
3 555 000 руб.'
;

foreach (
$example as $key=>$value)
{
    echo 
'<b>'.$key.'</b>';
    
preg_match_all("%(\d{1,3}\s\d{1,3}\s\d{1,3}\s*руб.)%"$value$out);
    
var_dump($out);
}
?>

Мой вариант выводит только если цена больше 1 млн. Как указать что цифр в порядках миллионов и сотен тысяч может не быть вовсе? Грубо говоря мне нужно найти "руб." и от него взять влево все цифры шаблона от 1 до 3 между которыми могут быть пробелы один или несколько(мало ли;)).

  Ответить  
 
 автор: Слух   (15.01.2010 в 12:56)   письмо автору
 
   для: Слух   (15.01.2010 в 12:32)
 

Попробовал сделать вот так, это правильно будет, или может захватить чтото лишнее, или наоборот отрезать?

<?
preg_match_all
("%(\d{0,3}\s*\d{0,3}\s*\d{1,3}\s*руб.)%"$value$out);
?>

  Ответить  
 
 автор: heed   (15.01.2010 в 16:15)   письмо автору
 
   для: Слух   (15.01.2010 в 12:56)
 

там не все возможные записи
это как делать например так
<pre><?php

$txt 
="'от 3 555 000 руб.  до 5 915 000 руб.'; 
\$example[] = 'можно купить за 555 000 руб. или 15 000 руб.'; 
\$example[] = ', 1 000 руб.'; 
\$example[] = '<br/>
1000 - 1500 руб
1.000.000 руб
1.50 руб 
1,50 руб 
"
;
preg_match_all('#\b(?:\d+\s*)+руб#'$txt$out);
print_r($out);
последние цены найдёт неправильно
, и бывают килорубли, мегарубли, и терабаксы.
// и бывает с НДС или без него

  Ответить  
 
 автор: Слух   (15.01.2010 в 17:36)   письмо автору
 
   для: heed   (15.01.2010 в 16:15)
 

Понял спасибо. На самом деле там может быть и ХХХ тыс. руб. и ХХ тысяч рублей.
Но меня интересовал именно случай ХХХ ХХХ ХХХ руб. Ну а цены с копейками в стоимости например квартир или автомобилей вряд ли можно встретить)
Спасибо за ответ.

ЗЫ: попробуйте в $txt добавить 30 рубашек, 22 рубрики

  Ответить  
 
 автор: heed   (15.01.2010 в 18:09)   письмо автору
 
   для: Слух   (15.01.2010 в 17:36)
 

>30 рубашек, 22 рубрики

просто обозначте конец слова

руб\b

  Ответить  
 
 автор: big-trot   (15.01.2010 в 23:22)   письмо автору
 
   для: Слух   (15.01.2010 в 12:32)
 

Предлагаю еще один вариант.

\b[\d\s,\.-]+руб(\.?|\s)

  Ответить  
 
 автор: Слух   (18.01.2010 в 10:39)   письмо автору
 
   для: big-trot   (15.01.2010 в 23:22)
 

Хороший вариант, но 1000 рубашек он тоже посчитает как 1000 руб.((
\b[\d\s,\.-]+


Можете объяснить\поправить что значит выражение
\b конец строки? Но если идет пример "тут какойто текст 1000 и опять текст 20"
Тут же нет конца строки, просто конец слова?
\d Это цифры
\s Это пробелы
,\.- Что означает вот это выражение?
И зачем это обрамлять в квадратные скобки?

Если не сложно дайте ссылку где можно подробней почитать про модификаторы и вышеописанные выражения.

  Ответить  
 
 автор: heed   (18.01.2010 в 12:05)   письмо автору
 
   для: Слух   (18.01.2010 в 10:39)
 

в мануале к php (не нашёл по русски) , там где sintax
http://ru.php.net/manual/en/book.pcre.php
// если с английским хоть как-нибудь, лучше сразу скачать мануал , хоть chm хоть tar.gz без разницы.

здесь есть в справочнике функций
http://softtime.ru/bookphp/help.php
хоть и уже не php4 но мало чего изменилось

\. это заэкранировали точку.
символы которые метасимволы []()?.+* почти всегда приходится экранировать
// в скобках [] не обязательно

  Ответить  
 
 автор: Слух   (18.01.2010 в 12:58)   письмо автору
 
   для: heed   (18.01.2010 в 12:05)
 

Спасибо за объяснение и ссылки, с английским порядок, почитаю.
И всетаки если разобрать данное выражение.
Мы ищем текст после которого могут быть цифры после которых должен быть пробел, запятая, точка, тире? потом "руб" потом либо точка либо пробел. Не понимаю тогда почему он 1000 рубашек тоже добавляет как удовлетворяющий условию? И если после текста и перед "руб" будет сто пробелов, он их тоже все добавит как удовлетворяющие условию?


\b[\d\s,\.-]+руб(\.?|\s)



Если лень отвечать или я напрягаю вопросами, я пойму. Просто хочется до конца разобраться, а не копипастить изменяя 2-3 символа.

  Ответить  
 
 автор: heed   (18.01.2010 в 14:41)   письмо автору
 
   для: Слух   (18.01.2010 в 12:58)
 

я-бы сделал так
\b граница (начало или конец) слова (под словами имеется ввиду [A-Za-z_0-9] плюс буквы национальных алфавитов в зависимочти от действующей локали и вообще библиотеки PCRE)

(?:\d+\s*)+ обязательное начало слова с цифры и потом пробелы и снова цифры если есть
, при [\d\s]+ , будет пытаться совпадать так-же совпадать с концами слов и пробелами, что займёт лишнее время (?:) это объединяющая подмаска

можно поставить вместо \s* например [\s.,-]*

руб если нужно с точками или продолжениями , перечислите то что нужно или \b конец слова

руб(?:лей|лёв|\b[.?!]?)

[.?!]? это любой из знаков препинания в скобках или может не быть ничего
(вне квадратных скобок нужно было-бы экранировать точку и вопрос обязательно)


[.?!]? можно убрать , если не нужны знаки препинания

//upd:
\b в начале просто чтобы не совпадало с FallOut3

  Ответить  
 
 автор: big-trot   (23.01.2010 в 11:58)   письмо автору
 
   для: Слух   (18.01.2010 в 12:58)
 

Чтобы не парсились "1000 рубашек ", предлагаю попробовать следующий вариант

\b[\d\s,\.-]+руб(\s|\.)

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

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