Помогите с regexp'ом
Всем заранее спасибо.
my $a = '/12//4-saf31_56aasfaFASfab5215wawe-wqrwqr/345324124-124214_2142144ASfdsa';
if ($a =~ m,(^[a-zA-Z0-9/\-_]+$),) {
print 'Ya!';
}
В php есть re-совместимые REшки, давно их не видел, и хз как они там:)) Ну должно работать, re`шка вроде бы простейшая;)
$a =~ m,(^[\w/\-]+$),i
Лол, как эт я не заметил)))))) Во-первых в [] задаюцца группы символов, и никакие встроенные токены сюда не вписываюцца=) максимум символ можно экранировать, и то не каждый=) так что [\w] ищет смвол 'w', ну и багодаря ключу i в любых регистрах=) Птом цирфы не входят в '\w', эт токен '\d' =)) И т.п. и т.д., выходит твой пример должен был выглядеть как (^(\w|\d|\/|\-)+$).. Что смотрица довольно неприятно, мой был лучше=) Хотя, кому как, главное не отказывацца от своего стиля=)))
Ну, в общем, бум думать, что Alone просто не выспался и чуток обшибся, знатокам позволительно=))))) Надеюсь, вы мя так же будете поправлять, когда количество постов уйдет за 500 и далее=)
Но врде вот так:
preg_match ("{^([a-z0-9/\-_]+)$}i",строка);
Ну, если нельзя ограничители произвольные использывать, тогда юзай '/' и заэкранируй слэш в паттерне;)
Цитата:
Originally posted by Shiizoo
так что [\w] ищет смвол 'w'
так что [\w] ищет смвол 'w'
бред сивой кобылы...
perldoc perlre
\w Match a "word" character (alphanumeric plus "_")
Я видимо тож ееще сплю...) но эт тя не поравдывает)
Да, я кстать тоже ошибся, по поводу \d =)) \w их тож включает=))))) альфанум, альфанум=) Только вот при юзании locale буквы, входящие в \w беруцца из заданной локали, и каков будет результат поиска при включенной русской локали, я даж боюсь предпологать=)) ведь alphanum эт alphabetic и numeric, то есть алфавитные буковки и цифры;) а алфавитные буквы эт отнюдь не только латиница=)
дописал туда от заголовка это:
use strict;
use locale;
use POSIX qw(locale_h);
setlocale(LC_CTYPE, "Russian_Russia.1251";);
Следовательно, локаль для CTYPE, от чего зависят регитсровые преобразования и все re`шки перла теперь содержит и cp1251 символику. Добавляю в перменную кирилицу:
my $a = '/12//4-saf31_56aasfaFASfab5215wawe-wqrwqr/345324124-124214_2142144ASfdsaяпавпвап';
Теперь меняю паттерн, но не тот, кторый ты показал, потому что он никак не заработает, а на вот этот. Ты должен понимать, что он рабочий=))):
if ($a =~ m,(^(\w|\/|\-)+$),) {
print 'Ya!';
}
У меня, как и вчера, в результате выписывается 'Ya!', что говорит о моей правоте. Юзание \w в данном случае не уместно, хотя бы в силу того, что n00b`ы любя ковырять локали, и все прочее, когда у них возникают проблемы, и если у него будет стоять русская, и скорее всего она будет применена к LC_ALL, то шаблон будет брать еще и кирилицу, что ему, исходя из содержания его просьбы, совсем не надо=))
EOF
документацию мы читать не хотим... понятно...
довай так, вот пример:
my $qq="/qwertyQ_123456 qqq";
print $qq=~/([\w]+)/;
говориш что выводит и почему
Угу, моя ошибка, но вот я добавил в твой скаляр русские буквы и паттерн все-равно сработал=) А знаешь почему? потому что у меня винда, и в переменной окружения установлена русскай локаль.. Так что \w не катит, делать скрипты, лишний раз зависимые от установок оси - дело наблагородное=)
Юзаем или мое: ,^[a-zA-Z0-9/_-]+$,
Или Alone`овское: ,^[\w/-]+$, (но тогда меняем локаль на сишную, или какую-нить латинскую, чтоб лишних символов в alphanum не было).