Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Аналог if string like "abcd*x*" в php ??

22K
26 июня 2007 года
AlKov
28 / / 26.06.2007
Вот такая задачка возникла: надо сравнить пару текстовых переменных по принципу сабж. как это делается в VB.. Но сделать сие надо в php.
Т.е. выполнить в php аналогично этому:
 
Код:
if MyString Like "bla*bla*" then
  a=1
End If

Никак не могу определиться, какой функцией php и как воспользоваться.. Функции сравнения строк здесь вроде не катят; что-то вертится на языке насчет preg_match(), но въехать в нужные паттерны никак не удается.. :(
Может кто решал задачку? Ткните в нужное место, плз! ;)
8
26 июня 2007 года
mfender
3.5K / / 15.06.2005
Всё то же самое. См ТУТ
22K
27 июня 2007 года
AlKov
28 / / 26.06.2007
Цитата: mfender
Всё то же самое. См ТУТ


Хм.. Да я еще "с утра" догадался, что "ТУТ". ;) Вопрос именно в том как написать верное регулярное выражение - не хватает толчины... :(

8
27 июня 2007 года
mfender
3.5K / / 15.06.2005
 
Код:
if(preg_match_all("/bla*/i", "sdjhf kjhf sdjhf sdg sdjkfh blaiuey kd fmndmblad")){
     ...........
}
22K
27 июня 2007 года
AlKov
28 / / 26.06.2007
Цитата: mfender
 
Код:
if(preg_match_all("/bla*/i", "sdjhf kjhf sdjhf sdg sdjkfh blaiuey kd fmndmblad")){
     ...........
}



А не работает.. Во всех случаях возвращает false.. Да и не должна вроде как Ваша конструкция вообще работать, т.к. preg_match_all должна иметь третий параметр (массив, куда записывать результат) и вообще, судя по этому:

Цитата:
Описание
int preg_match_all (string pattern, string subject, array matches [, int flags])

Ищет в subject все совпадения с регулярным выражением pattern и помещает их в matches в порядке, специфицированном в order.

После нахождения первого совпадения последующий поиск продолжается до нахождения последнего совпадения.
.....
Возвращает количество полных совпадений с патэрном (это может быть нуль), или FALSE при ошибке.

это не "мой" вариант и он не может заменить Like Mystring*x*..
Например, как с помощью этой конструкции отличить "Тариф 150" от "Тариф 150 плюс" ?
Или я не понял Вашу мысль, или она ошибочна.. :(

13
27 июня 2007 года
RussianSpy
3.0K / / 04.07.2006
А вы не пробовали открыть мануал или прочитать пару статей? Ваши вопросы неадекватны ИМХО
22K
27 июня 2007 года
AlKov
28 / / 26.06.2007
Цитата: RussianSpy
А вы не пробовали открыть мануал или прочитать пару статей? Ваши вопросы неадекватны ИМХО



Гм.. Ну, если Вы читали мой последний пост (надеюсь, и первый тоже ;) ), то наверное заметили, что приведенная мной цитата по ф-ции preg_match_all() взята именно из мануала по php. Это ответ на первую часть Вашего вопроса..
Насчет прочтения статей - читал и не одну и пару и не три.. Но, к сожалению, так и не нашел решения. Согласен, что либо плохо читал, либо не то, что надо, но факт остается фактом.. Иначе я бы вообще и не написал первый пост...
Второе - в чем Вы видите неадекватность моих вопросов? С самого начала был задан один-единственный вопрос: как на php собрать аналог VB оператора Like и предположение о том, что возможно это решается с помощью ф-ции preg_mach.. и то, что я НЕ МОГУ САМОСТОЯТЕЛЬНО разобраться с составлением нужного рег. выражения.

P.S. И вот мое ИМХО - форум существует именно для того, чтобы помочь советом, примерами и т.п., но не для чтения нравоучений задавшему вопрос и показания личного превосходства в знании вопроса..
Извиняюсь за оффтоп и некоторую резкость...

8
27 июня 2007 года
mfender
3.5K / / 15.06.2005
Цитата:
Да и не должна вроде как Ваша конструкция вообще работать, т.к. preg_match_all должна иметь третий параметр (массив, куда записывать результат)


Дык допиши туда нужное. В чём проблема? Я написал тут и не попробовал на работоспособность написанное и потому пропустил третий параметр, но могу точно (100%) сказать, что это функция вернёт (int)2 а в третий параметр будет записан массив с двумя элементами, значения которых будут "bla". Мне даже PHP и компьютера не надо, чтобы это утверждать.

7.9K
27 июня 2007 года
vasa_c
191 / / 05.04.2007
Вот я бы без проблем написал вам регулярку. Если конечно не злой был.
Вот только проблема, я вообще не рублю в VB. Меня просто плющит от такого, уже не первый раз сталкиваюсь с подобной темой. Почему сразу не задать конкретный вопрос?
22K
28 июня 2007 года
AlKov
28 / / 26.06.2007
Цитата: mfender
Дык допиши туда нужное. В чём проблема? Я написал тут и не попробовал на работоспособность написанное и потому пропустил третий параметр, но могу точно (100%) сказать, что это функция вернёт (int)2 а в третий параметр будет записан массив с двумя элементами, значения которых будут "bla". Мне даже PHP и компьютера не надо, чтобы это утверждать.



Ух, ребята, какие Вы все сердитые и скорые на расправу! :) Ну, конечно же я добавил нужный параметр и проверил, что мне вернула функция. Совершенно верно - в Вашем примере будет (int)2, но что из этого?! Повторюсь еще раз: как с помощью этой конструкции отличить "Тариф 150" от "Тариф 300 плюс" ? preg_match_all "плюет с большой колокольни" на все, что идет после первого совпадения - в данном случае "Тариф". И "*" в паттерне совершенно ничего не решает! Что она есть, что ее нет - результат одинаков..

vasa_c, ну если не нравится Вам VB, так давайте забудем про него! Подскажите тогда, как решить озвученную выше задачу на php? Тем более, если Вам это, как два байта переслать! ;)

P.S. Вообщем-то задачу мне помог решить мой молодой коллега, правда другим способом; несколько громоздко, но работает! Вот код:

Код:
function Like($str1,$like)
{
$pos1=strpos($like,"*");
if($pos1===false)
{
 $pos1=strlen($like);
}

$a=substr($like,0,$pos1);


$pos=strpos($str1,$a);
if($pos===false)
 {
  return 0;
 }
else
  {
   $b=substr($like,$pos1+1,strlen($like));
   $pos2=strpos($str1,$b);
   if($b!="" && $pos2===false)
   {
    return 0;
   }
   else
    return 1;
   }

  }

Так-что прошу всех принять ..надцать капель валерьянки или стопочку бальзама (кому чего приятнее) и не нервничать. ;) У нас уже все хорошо! :D
P.P.S. - шутка..
13
28 июня 2007 года
RussianSpy
3.0K / / 04.07.2006
Мда... слов просто нет.... передайте спасибо вашему коллеге меня лично (уверен остальные участники форума ко мне присоединятся) за то что он избавил нас от такой "страшной" проблемы языка РНР.
8
28 июня 2007 года
mfender
3.5K / / 15.06.2005
 
Код:
$pat = "/(тариф)\s*((\d+)\s*(\w*))/i";
preg_match_all($pat, $str, $res, PREG_SET_ORDER);
echo trim("{$res[0][1]} - {$res[0][3]} {$res[0][4]}");


Будет работать и если $str будет значением "Тариф 150", и если "Тариф 300 плюс", и даже если "Тариф300плюс"

PS.

Цитата:
Вообщем-то задачу мне помог решить мой молодой коллега, правда другим способом; несколько громоздко, но работает! Вот код:



Пошёл я пить валерианку. Смеяться уже тяжело... Молодых коллег - об стенку и на подсобные работы. Зарплату зазря получают, дармоеды.

92
28 июня 2007 года
Тень Пса
2.2K / / 19.10.2006
RussianSpy, mfender, валерьянки не осталось????? :D
22K
28 июня 2007 года
AlKov
28 / / 26.06.2007
Цитата: mfender
 
Код:
$pat = "/(тариф)\s*((\d+)\s*(\w*))/i";
preg_match_all($pat, $str, $res, PREG_SET_ORDER);
echo trim("{$res[0][1]} - {$res[0][3]} {$res[0][4]}");

Будет работать и если $str будет значением "Тариф 150", и если "Тариф 300 плюс", и даже если "Тариф300плюс"
PS.


Ну что ж, давайте попробуем проверить..
Итак, пишу такой скрипт:

Код:
<?php
//
$tarif = array("Тариф 150 плюс","Тариф 150","Супер 300","Мега 500");
$patt = array("/(Тарифплюс)\s*((\d+)\s*(\w*))/i","/(Тариф)\s*((\d+)\s*(\w*))/i",
              "/(Супер)\s*((\d+)\s*(\w*))/i","/(Мега)\s*((\d+)\s*(\w*))/i");
//
 for ($i=0;$i<4;$i++)
  {
   echo "result(".$i.") = ".Like($tarif[$i],$patt[$i])."<br>";
    }
//
function Like($str,$pat)
 {
  if(preg_match_all($pat, $str, $res, PREG_SET_ORDER))
   {
    $ret = trim("{$res[0][1]} - {$res[0][3]} {$res[0][4]}");
    return $ret;
   } else {
     return "Not found...";
   }
    }
//
?>

На "выходе" имеем следующий результат:
 
Код:
result(0) = Not found...
result(1) = Тариф - 150
result(2) = Супер - 300
result(3) = Мега - 500

Ну и? Где "определение" первого тарифа?? И где "Будет работать... и даже если "Тариф300плюс""??

Цитата: mfender

Пошёл я пить валерианку. Смеяться уже тяжело... Молодых коллег - об стенку и на подсобные работы. Зарплату зазря получают, дармоеды.


Ну нет уж! Пока Ваш пример не заработает, коллегу в обиду не дам! :D

92
28 июня 2007 года
Тень Пса
2.2K / / 19.10.2006
[COLOR=#000000][COLOR=#dd0000]"/(Тарифплюс)\s*((\d+)\s*(\w*))/i"[/COLOR]

что это за маска? сам понял что написал?

PS: слово "Тарифплюс" потом пробелов сколько угодно, потом Число, потом пробел и слово. похоже на первую строку (тариф), которая равна [/COLOR][COLOR=#000000][COLOR=#dd0000]"Тариф 150 плюс"[/COLOR][/COLOR][COLOR=#000000]? или это меня уже зрение подводит?
[/COLOR]
13
28 июня 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: Тень Пса
[COLOR=#000000][COLOR=#dd0000]"/(Тарифплюс)\s*((\d+)\s*(\w*))/i"[/COLOR]

что это за маска? сам понял что написал?


Зачем понимать? Статей он кучу прочел, мануал наизусть знает - все бестолкое ведь понимаешь. Регулярные выражения - особая реликтовая магия, которой программисты не хотят делиться с новичками.



AlKov: давай ты мне в приват кинешь свой емейл - я тебе на него скину мегабестселлер O'Reilly "Mastering Regular Expressions". Если и эта книга не поможет и окажется бесполезной для великого гуру - тогда выход один - объявить РНР убогим языком и пойти писать на чем-нибудь другом (желательно не языке программирования).

22K
28 июня 2007 года
AlKov
28 / / 26.06.2007
Цитата: Тень Пса
[COLOR=#000000][COLOR=#dd0000]"/(Тарифплюс)\s*((\d+)\s*(\w*))/i"[/COLOR]

что это за маска? сам понял что написал?

PS: слово "Тарифплюс" потом пробелов сколько угодно, потом Число, потом пробел и слово. похоже на первую строку (тариф), которая равна [/COLOR][COLOR=#000000][COLOR=#dd0000]"Тариф 150 плюс"[/COLOR][/COLOR][COLOR=#000000]? или это меня уже зрение подводит?
[/COLOR]



Ну да.. Действительно глупость сморозил.. :confused: Но, к сожалению, все что было предложено, рассчитано на конкретные значения проверяемой переменной.. А мне нужна универсальная функция и, как уже было сказано в сабж, подобная Like string*string1*. Типа так:

 
Код:
if $tarif Like "Тариф*плюс" ...
А если я захочу изменить имя этого самого "тарифа", например, вместо "Тариф 150 плюс" сделать "Тариф люкс +"? Это значит снова лезть в код и править маски.. :eek:
Подводя итог дискуссии хочу сказать спасибо Вам и mfender за реальную помощь (остальные либо стучали в грудь кулаком, либо читали нравоучения). Считаю, что тему можно закрыть - заходим в тупик непонимания.. :(
8
28 июня 2007 года
mfender
3.5K / / 15.06.2005
Вся беда в том, что никто не увидел конкретно поставленной задачи. ТЗ, так сказать. Так что, "неча на зеркало пенять"... Аффтор изволил начать с непонятного "как мне отделить bla*bla* от bla*bla*", продолжил задачей со словом "тариф", а потом выяснилось, что слово "тариф" не катит как ключевое и константа, как это объявлялось где-то в середине...

2AlKov: Бросьте всё, в том числе и "молодых коллег". Такие элементарные вещи нужно знать. Совсем не обязательно знать, как в регулярных выражениях создаются циклы, но элементарное нужно знать. Если Вы изволили заявить, что можете сообщаться с регулярными в VB, то это автоматически распрострашняется на всё остальное (PHP в том числе). Так что...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог