Аналог if string like "abcd*x*" в php ??
Т.е. выполнить в php аналогично этому:
a=1
End If
Никак не могу определиться, какой функцией php и как воспользоваться.. Функции сравнения строк здесь вроде не катят; что-то вертится на языке насчет preg_match(), но въехать в нужные паттерны никак не удается.. :(
Может кто решал задачку? Ткните в нужное место, плз! ;)
Хм.. Да я еще "с утра" догадался, что "ТУТ". ;) Вопрос именно в том как написать верное регулярное выражение - не хватает толчины... :(
...........
}
...........
}
А не работает.. Во всех случаях возвращает 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 плюс" ?
Или я не понял Вашу мысль, или она ошибочна.. :(
Гм.. Ну, если Вы читали мой последний пост (надеюсь, и первый тоже ;) ), то наверное заметили, что приведенная мной цитата по ф-ции preg_match_all() взята именно из мануала по php. Это ответ на первую часть Вашего вопроса..
Насчет прочтения статей - читал и не одну и пару и не три.. Но, к сожалению, так и не нашел решения. Согласен, что либо плохо читал, либо не то, что надо, но факт остается фактом.. Иначе я бы вообще и не написал первый пост...
Второе - в чем Вы видите неадекватность моих вопросов? С самого начала был задан один-единственный вопрос: как на php собрать аналог VB оператора Like и предположение о том, что возможно это решается с помощью ф-ции preg_mach.. и то, что я НЕ МОГУ САМОСТОЯТЕЛЬНО разобраться с составлением нужного рег. выражения.
P.S. И вот мое ИМХО - форум существует именно для того, чтобы помочь советом, примерами и т.п., но не для чтения нравоучений задавшему вопрос и показания личного превосходства в знании вопроса..
Извиняюсь за оффтоп и некоторую резкость...
Дык допиши туда нужное. В чём проблема? Я написал тут и не попробовал на работоспособность написанное и потому пропустил третий параметр, но могу точно (100%) сказать, что это функция вернёт (int)2 а в третий параметр будет записан массив с двумя элементами, значения которых будут "bla". Мне даже PHP и компьютера не надо, чтобы это утверждать.
Вот только проблема, я вообще не рублю в VB. Меня просто плющит от такого, уже не первый раз сталкиваюсь с подобной темой. Почему сразу не задать конкретный вопрос?
Ух, ребята, какие Вы все сердитые и скорые на расправу! :) Ну, конечно же я добавил нужный параметр и проверил, что мне вернула функция. Совершенно верно - в Вашем примере будет (int)2, но что из этого?! Повторюсь еще раз: как с помощью этой конструкции отличить "Тариф 150" от "Тариф 300 плюс" ? preg_match_all "плюет с большой колокольни" на все, что идет после первого совпадения - в данном случае "Тариф". И "*" в паттерне совершенно ничего не решает! Что она есть, что ее нет - результат одинаков..
vasa_c, ну если не нравится Вам VB, так давайте забудем про него! Подскажите тогда, как решить озвученную выше задачу на php? Тем более, если Вам это, как два байта переслать! ;)
P.S. Вообщем-то задачу мне помог решить мой молодой коллега, правда другим способом; несколько громоздко, но работает! Вот код:
{
$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. - шутка..
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.
Пошёл я пить валерианку. Смеяться уже тяжело... Молодых коллег - об стенку и на подсобные работы. Зарплату зазря получают, дармоеды.
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.
Ну что ж, давайте попробуем проверить..
Итак, пишу такой скрипт:
//
$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(1) = Тариф - 150
result(2) = Супер - 300
result(3) = Мега - 500
Ну и? Где "определение" первого тарифа?? И где "Будет работать... и даже если "Тариф300плюс""??
Пошёл я пить валерианку. Смеяться уже тяжело... Молодых коллег - об стенку и на подсобные работы. Зарплату зазря получают, дармоеды.
Ну нет уж! Пока Ваш пример не заработает, коллегу в обиду не дам! :D
что это за маска? сам понял что написал?
PS: слово "Тарифплюс" потом пробелов сколько угодно, потом Число, потом пробел и слово. похоже на первую строку (тариф), которая равна [/COLOR][COLOR=#000000][COLOR=#dd0000]"Тариф 150 плюс"[/COLOR][/COLOR][COLOR=#000000]? или это меня уже зрение подводит?
[/COLOR]
что это за маска? сам понял что написал?
Зачем понимать? Статей он кучу прочел, мануал наизусть знает - все бестолкое ведь понимаешь. Регулярные выражения - особая реликтовая магия, которой программисты не хотят делиться с новичками.
AlKov: давай ты мне в приват кинешь свой емейл - я тебе на него скину мегабестселлер O'Reilly "Mastering Regular Expressions". Если и эта книга не поможет и окажется бесполезной для великого гуру - тогда выход один - объявить РНР убогим языком и пойти писать на чем-нибудь другом (желательно не языке программирования).
что это за маска? сам понял что написал?
PS: слово "Тарифплюс" потом пробелов сколько угодно, потом Число, потом пробел и слово. похоже на первую строку (тариф), которая равна [/COLOR][COLOR=#000000][COLOR=#dd0000]"Тариф 150 плюс"[/COLOR][/COLOR][COLOR=#000000]? или это меня уже зрение подводит?
[/COLOR]
Ну да.. Действительно глупость сморозил.. :confused: Но, к сожалению, все что было предложено, рассчитано на конкретные значения проверяемой переменной.. А мне нужна универсальная функция и, как уже было сказано в сабж, подобная Like string*string1*. Типа так:
Подводя итог дискуссии хочу сказать спасибо Вам и mfender за реальную помощь (остальные либо стучали в грудь кулаком, либо читали нравоучения). Считаю, что тему можно закрыть - заходим в тупик непонимания.. :(
2AlKov: Бросьте всё, в том числе и "молодых коллег". Такие элементарные вещи нужно знать. Совсем не обязательно знать, как в регулярных выражениях создаются циклы, но элементарное нужно знать. Если Вы изволили заявить, что можете сообщаться с регулярными в VB, то это автоматически распрострашняется на всё остальное (PHP в том числе). Так что...