[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: "не" в регулярных выражениях
Hugo_O
список букв допустим:
$x="b|i|u|a|"
В общем я проверяю переменную на пустоту, НО
if (!preg_match("/(\S+)/i", $message)) - это означает вообще любой символ, но нам еще надо исключить случаи, когда нет ни одного символа, но есть "пустота [$x] пустота [\$x] пустота", надо чтобы и они возвращали false, как составить общее регулярное выражение?



Спустя 4 минуты, 10 секунд (17.06.2010 - 12:19) tomash написал(а):
\S все видимые символы насколько я помню

Спустя 3 минуты, 13 секунд (17.06.2010 - 12:22) Hugo_O написал(а):
tomash
ну да, это понятно(мне пробел тоже не нужен), но вопрос не в этом!

Спустя 4 минуты, 19 секунд (17.06.2010 - 12:26) tomash написал(а):
"не" - ^ перед символьным класом например ([^\d]+) - не цифра

Спустя 20 минут, 49 секунд (17.06.2010 - 12:47) Hugo_O написал(а):
tomash
основы-то я знаю, но не получается составить то что нужно!

Спустя 6 минут, 18 секунд (17.06.2010 - 12:53) tomash написал(а):
А можно пример??? А то я что-то торможу... не могу въехать
если так? "/(\S+)|(\s+)/i"
или так? "/([\S|\s]+)/i"

Спустя 39 секунд (17.06.2010 - 12:54) Ice написал(а):
что за пустота, никак не могу понять?

tomash, если Вы не собираетесь запоминать сгруппированные значения, советую использовать несохраняющую группировку -
(?:\S|\s)+

Спустя 6 минут, 24 секунды (17.06.2010 - 13:01) tomash написал(а):
Ice
Знаю знаю... но спасибо smile.gif

Спустя 8 минут, 13 секунд (17.06.2010 - 13:09) Hugo_O написал(а):
Ice
tomash
ладно объясню более человечески))
если человек не напишет ни одного символа- то это понятно как контролировать
например, "/(\S+)/i" - этого вроде как достаточно, а если он в поле ввода вставит бб-код, например [bb] [/bb] и ВСЕ - здесь же присутствуют символы, но нам нужно понять, что это сообщение все равно НА САМОМ-ТО ДЕЛЕ пустое, вот о чем я!!!!

Спустя 11 минут, 55 секунд (17.06.2010 - 13:21) Winston написал(а):
Так ?

$message = trim($message);
if (preg_match("/\[(i|b|u|s)\] ?\[\/(i|b|u|s)\]/i", $message))
echo 'Заполните поле !';
else
......


Спустя 4 минуты, 42 секунды (17.06.2010 - 13:25) tomash написал(а):
Ясно))))
((\[\S+\]\S+\[\S+\])|([^\[]\S+))

Спустя 3 минуты, 28 секунд (17.06.2010 - 13:29) Ice написал(а):
Цитата (Hugo_O @ 17.06.2010 - 14:09)
Ice
tomash
ладно объясню более человечески))
если человек не напишет ни одного символа- то это понятно как контролировать
например, "/(\S+)/i" - этого вроде как достаточно, а если он в поле ввода вставит бб-код, например [bb] [/bb] и ВСЕ - здесь же присутствуют символы, но нам нужно понять, что это сообщение все равно НА САМОМ-ТО ДЕЛЕ пустое, вот о чем я!!!!

проверку пустой строки лучше осуществить функцией empty().
А вот проверку наличия какого-то слова внутри тегов, наверное так:

(?<=[bb])\w+(?=[/bb])

Спустя 16 минут, 46 секунд (17.06.2010 - 13:46) Hugo_O написал(а):
tomash
Ice
не работает, пытаюсь найти ошибку, но это ппц, надоели эти рег. выражения уже...

Спустя 12 минут, 26 секунд (17.06.2010 - 13:58) tomash написал(а):
сначала прверку на пустоту, а потом на бб-код "/(\[\S+\]\S+\[\S+\])/"

Спустя 5 минут, 1 секунда (17.06.2010 - 14:03) Hugo_O написал(а):
tomash
спасибо за помощь!!!
только вместо проверки, я сделал замену пустых тэгов на ''.

Спустя 7 минут, 3 секунды (17.06.2010 - 14:10) tomash написал(а):
Hugo_O
biggrin.gif а я воюю с обратным слэшом blink.gif

Спустя 4 минуты, 11 секунд (17.06.2010 - 14:14) Ice написал(а):
всё, господа, прекрасно работает wink.gif


$string = "<dd>Hello, world!</dd>";
print preg_match('/(?<=<dd>)[^<>]+(?=<\/dd>)/i', $string ); // выведет 1

Спустя 2 часа, 43 минуты, 45 секунд (17.06.2010 - 16:58) FatCat написал(а):
Мы ушли от темы "не" в регулярках.
Часто с этим сталкиваюсь, тоже не могу найти решения.
Простой пример:
Мне нужен массив внешних линков.
Просто массив линков получаю регуляркой:
preg_match_all('/<a href="http:\/\/(.*?)"/si', $page, $result);

Но туда валятся и внутренние линки.
Как сделать, чтобы в массив НЕ попадали линки, содержащие подстроку site.ru?

Спустя 14 минут, 41 секунда (17.06.2010 - 17:13) tomash написал(а):
[^s{1}i{1}t{1}e{1}\.{1}r{1}u{1}]$

Спустя 3 часа, 58 минут, 6 секунд (17.06.2010 - 21:11) FatCat написал(а):
tomash
Это для жесткой последовательности символов.
А если нужно все ссылки, кроме доменов, имеющих двойную букву?
Чтобы приняло mail.ru, yandex.ru и не приняло google.ru и saakh.com?

Спустя 15 минут, 33 секунды (17.06.2010 - 21:26) tomash написал(а):
FatCat
В регулярных выражениях нет логического "И", было бы проще...
Кстати слышали о програмке Regex Coach

Спустя 1 час, 36 минут, 16 секунд (17.06.2010 - 23:03) DedMorozzz написал(а):
Цитата
А если нужно все ссылки, кроме доменов, имеющих двойную букву?
разбить домен по буквам и сравнивать текущую со следующей.
Иль надобно именно регуляркой?

Спустя 13 минут, 42 секунды (17.06.2010 - 23:16) tomash написал(а):
DedMorozzz
Вариантов всегда много, можно ли сделать это регуляркой?

Спустя 14 минут, 59 секунд (17.06.2010 - 23:31) DedMorozzz написал(а):
Да можно. Но регулярка очень не качественная выйдет. Перечислять все буквы и указывать, что такая же буква дальше не может стоять. В принципе, шаблон для 1й буквы делается, а далее - копипаст с заменой алфавита, но, как уже сказал, регулярка не красивая выйдет, но зделать - можно

Спустя 4 минуты, 37 секунд (17.06.2010 - 23:36) tomash написал(а):
DedMorozzz
Вот и то, что не красивая.... а хочется поэлегантней!

Спустя 17 минут, 2 секунды (17.06.2010 - 23:53) DedMorozzz написал(а):
Аж самому стало интересно, сделал заготовку. Идея думаю будет ясна:
$a="yandex.com";
preg_match_all("#^((a(?!a))*(b(?!B))*(c(?!c))*(d(?!d))*(e(?!e))*(f(?!f))*(g(?!g))*(y(?!y))*(n(?!n))*(d(?!d))*(e(?!e))*(x(?!x))*)+\.com$#",$a,$matches);
print_r($matches);

В переменую $a можно задавать все буквы, которые есть в регулярке(a-g,e,f,x), остальные по такому же принципу дописать, просто по алфавиту. Если не будут 2 одинаковые буквы стоять рядом, то всё ок. Иначе - не будет совпадения, ошибка.
А если по элегантнее - то предварительно циклом прогнать 1 "звено" (буква(?!буква), ставя следующую букву и в дальнейшем просто переменную засунуть в регулярку. Но поскольку вопрос был именно регуляркой, то его и написал.

Спустя 10 часов, 23 минуты, 36 секунд (18.06.2010 - 10:17) DedMorozzz написал(а):
Выделил пару мин, доделал до норм вида smile.gif
$b='';
for($i=ord('a');$i<=ord('z');$i++){
$b .='('.chr($i).'(?!'.chr($i).'))?';
}
$a="yandex.com";
preg_match_all("#^($b)+\.[a-z]{2,6}(\.[a-z]{2,6})?$#",$a,$matches);
echo $matches[0][0];

Спустя 50 минут, 56 секунд (18.06.2010 - 11:07) tomash написал(а):
DedMorozzz
есть такое дело )))

Спустя 4 минуты, 38 секунд (18.06.2010 - 11:12) DedMorozzz написал(а):
Конечно я понятия не имею, куда таковое можно применить, но всё же... (:

Спустя 3 минуты, 59 секунд (18.06.2010 - 11:16) tomash написал(а):
DedMorozzz
Задача теоретическая... Я вот думаю возможно ли использовать результат совпадения с подстрокой в этой же регулярке?????

Спустя 8 минут, 15 секунд (18.06.2010 - 11:24) DedMorozzz написал(а):
Да можно. Строить выражение и смотреть совпадает ли такое же слева иль с права от нужного, пропуская промежуточные символы. Регулярками вообще можно всё сделать, хоть ДНК описать.

Спустя 11 минут, 37 секунд (18.06.2010 - 11:36) tomash написал(а):
DedMorozzz
Искал но не нашел, если мы сохраняем результат вхождения подстроки "()", то как ее засунуть опять в регулярку в эту же???

Спустя 3 минуты, 20 секунд (18.06.2010 - 11:39) DedMorozzz написал(а):
=) Да и не надо "такого" искать, это нереально по-индусски выйдет, хотя можно.
В таких случаях намного лучше делать в пару этапов.

Спустя 13 минут, 52 секунды (18.06.2010 - 11:53) tomash написал(а):
DedMorozzz
Может подскажете как? Знаний много не бывает) Применять или не применять, это второй вопрос!

Спустя 21 день, 1 час, 37 минут, 27 секунд (9.07.2010 - 13:31) DedMorozzz написал(а):
tomash, хы, кидал ссылку на тему вопрос увидал smile.gif Делается сие через ссылки. Т.е. "(aaa)? ..... (?(1) ...)" - т.е. то что во вторых скобках выполняется лишь тогда, когда то, что в первых выполнено, т.е. условие вышло.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.