HELP! Регулярное выражение

12
R
На сайте с 20.03.2011
Offline
13
1051

Есть фразы:

от 5-ти до 18-ти товаров

от 5-ти до 18

от 5-ти выше

5-ти выше

5-18

Нужно из этой фразы preg_match`ем вынимать цифры. Их может быть одна или две (как в примерах) строка может начинаться с цифры и заканчиваться цифрой. Цифры обязательно нужно получить отдельно и в шаблоне они должны быть разделены хотя бы пробелом или другим знаком.

preg_match("/(.*)([0-9]*)(.*)/", "от 5-ти до 18-ти товаров");

вот так не работает=((

DiAksID
На сайте с 02.08.2008
Offline
236
#1

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


preg_match — выполняет проверку на соответствие регулярному выражению,
возвращает количество найденных соответствий.
show must go on !!!...
R
На сайте с 20.03.2011
Offline
13
#2

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

Если у кого-то есть другие решения - готов выслушать.

Вырезать все лишнее preg_replace - не вариант, так как останется у меня 518 и куда я его дену? мне нужно две цифры 5 и 18, отдельно.

DiAksID
На сайте с 02.08.2008
Offline
236
#3

хватит тупить. в указанном варианте вызова preg_match возвращает количество найденных соответствий.

mixed preg_match ( string $pattern, string $subject [, array $&matches [, int $flags [, int $offset]]] )

R
На сайте с 20.03.2011
Offline
13
#4

Ув. DiAksID, я понимаю, что ваш авторитет здесь гораздо выше моего. Но, все таки, это не дает вам право вести себя по хамски с участниками форума.

Я не первый день программирую и использую данные функции. Поэтому я в курсе что они возвращают. Мой вопрос был связан не с синтаксисом функции, а с составлением регулярного выражения "/(.*)([0-9]*)(.*)/" - вот такого текста.

preg_match("/(.*)([0-9]*)(.*)/", "от 5-ти до 18-ти товаров", $matches);

print_r($matches);

Прошу не оффтопить.

Если я выбрал не самый правильный способ - покажите как правильно.

---------- Добавлено 04.04.2012 в 09:24 ----------

"/([\s\d][\d+][\s\d]*)/" - вот так выдает Array ( [0] => 5 [1] => 5 )

"/([\s\d][\d+][\s\d])/" - вот так выдает Array ( [0] => 18 [1] => 18 )

Как склеить что бы в массиве было

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

sabotage
На сайте с 14.02.2007
Offline
192
#5

$arr = array(

'от 5-ти до 18-ти товаров',
'от 5-ти до 18',
'от 5-ти выше',
'5-ти выше',
'5-18',
);

foreach ($arr as $str) {
$ptrn = '~([0-9]+)([^0-9]*)([0-9]*)~iu';
if (preg_match($ptrn, $str, $out)){
echo "{$out[1]} {$out[3]}<br />\n";
} else echo "мимо<br />\n";

}
siv1987
На сайте с 02.04.2009
Offline
427
#6

preg_match_all

D
На сайте с 14.01.2007
Offline
153
#7

(\d+)[^0-9]+(\d+)?

R
На сайте с 20.03.2011
Offline
13
#8
sabotage:
$arr = array(

'от 5-ти до 18-ти товаров',
'от 5-ти до 18',
'от 5-ти выше',
'5-ти выше',
'5-18',
);

foreach ($arr as $str) {
$ptrn = '~([0-9]+)([^0-9]*)([0-9]*)~iu';
if (preg_match($ptrn, $str, $out)){
echo "{$out[1]} {$out[3]}<br />\n";
} else echo "мимо<br />\n";

}

Отлично работает. Спасибо!

---------- Добавлено 04.04.2012 в 15:44 ----------

Dinozavr:
(\d+)[^0-9]+(\d+)?

вот что говорит скрипт на ваше выражение

5
5
мимо
мимо
5

Но, благодарю за попытку=)

D
На сайте с 14.01.2007
Offline
153
#9
Rafic:
вот что говорит скрипт на ваше выражение

ну так проверте ваш скрипт:)


$a=array("от 5-ти до 18-ти товаров","от 5-ти до 18","от 5-ти выше","5-ти выше","5-18");
foreach($a as $b){
preg_match("/(\d+)[^0-9]+(\d+)?/",$b,$m);
if (!isset($m[2])){
$m[2]="";
}
echo $b." --- ".$m[1]."+".$m[2]."<br>";
}


от 5-ти до 18-ти товаров --- 5+18
от 5-ти до 18 --- 5+18
от 5-ти выше --- 5+
5-ти выше --- 5+
5-18 --- 5+18
R
На сайте с 20.03.2011
Offline
13
#10
Dinozavr:
ну так проверте ваш скрипт:)

$a=array("от 5-ти до 18-ти товаров","от 5-ти до 18","от 5-ти выше","5-ти выше","5-18");
foreach($a as $b){
preg_match("/(\d+)[^0-9]+(\d+)?/",$b,$m);
if (!isset($m[2])){
$m[2]="";
}
echo $b." --- ".$m[1]."+".$m[2]."<br>";
}


от 5-ти до 18-ти товаров --- 5+18
от 5-ти до 18 --- 5+18
от 5-ти выше --- 5+
5-ти выше --- 5+
5-18 --- 5+18

Я вставил ваш вариант в скрипт sabotage. В цикле подаются разные фразы...

Вы проверяли ваш вариант в работоспособности или вы не проверяя утверждаете что он работает?

Если можно, выложите код вашей проверки вместе с фразой.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий