[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ошибка в регулярном выражении
ferol
Хочу записать регвыр = "начинается на... и заканчивается на..."
PHP
$ra='adartwgsdhtr';
preg_match('/^[abcd][wg]$/U', $ra, $arr);
echo $arr[0];

Хочу получить artw, но результат - пустая строка. Что не так?



Спустя 1 час, 16 минут, 5 секунд (17.01.2009 - 16:41) Adamant написал(а):
Вы указали в паттерне, что нужно искать совпадение с условием:
в начале строки должна быть одна любая буква из - abcd и в конце строки должна быть любая из букв w или g, и причем между ними ничего не должно быть [abcd][wg]. Так что все нормально, совпадений с ваше строкой никаких нет.
Вам нужно
PHP
$ra='adartwgsdhtr';
preg_match('/^[abcd].*(artw).*[tr]$/U', $ra, $arr);
echo $arr[1];


Или если я вас правильно понял можно так
PHP
$ra = 'adartwgsdhtr';
preg_match('/[abcd]+(artw)(?:g)/U', $ra, $arr);
echo $arr[1]; // выводим содержимое кармана 1
// а вообще при работе с регулярками лучше результат смотреть с помощью
// echo '<pre>';
// print_r($arr);
// echo '</pre>';


Ищем совпадение: первая буква любая из - abcd и причем их может быть 1 и более (стоит + после квадратных скобок [])
потом идет "карман" (artw) который будет запомнен , потом буква g в кармане который не будет запомнен (?:).

ЗЫ. Советую почитать очень хорошую статью о регулярках http://phpclub.ru/detail/article/regexp_1
Я когда то с нее начинал.

Спустя 53 минуты, 59 секунд (17.01.2009 - 17:35) ferol написал(а):
Если я правильно понял, такой код
PHP
$ra='adartwgsdhtr';
preg_match('/^[abcd]+[rt]+$/U', $ra, $arr);
echo $arr[1];

должен дать в результате ar. Но результат - пустая строка!
код
PHP
$ra='adartwgsdhtr';
preg_match('/^[abcd]+[^\s]*[rt]+$/U', $ra, $arr);
echo $arr[1];

тоже должен возвращать ar, но результат тот же - путсой массив!

Спустя 2 часа, 35 минут, 13 секунд (17.01.2009 - 20:10) Adamant написал(а):
Вы неправильно поняли.
PHP
$ra = 'adartwgsdhtr';
preg_match('/^[abcd]+[rt]+$/U', $ra, $arr);
echo $arr[1];


'/^[abcd]+[rt]+$/U' - в начале строки идут буквы из набора abcd и в конце строки идут буквы из набора rt и все! Между ними вы указали, что не должно быть ничего! (Если вы хотите что-то "выбрать" из исходного текста указывайте искомый шаблон в кармане, который вы и будете получать в возвращаемом массиве в индексе под таким же номером, каким по порядку идет карман в вашем паттерне.)
И к тому же вы пытаетесь вывести на печать содержимое кармана 1 КОТОРОГО НЕТ - он в паттерне обозначается как ()

И я же вам советовал смотреть результат

PHP
echo '<pre>';
print_r($arr);
echo '</pre>';


В возвращаемом массиве
в индексе [0] - содержится полное совпадение со всем шаблоном.
в индексе [1] - содержится совпадение с первым карманом (если он указан в паттерне иначе этого индекса не создается).



Спустя 8 минут, 15 секунд (17.01.2009 - 20:18) Sylex написал(а):
потому что символ ^ указывает, что поиск должен идти С САМОГО НАЧАЛА строки, в данном случае не подходит под шаблон.

поставьте конкретную задачу, в вашем первом посте совершенно непонятно зачем вы ставите [abcd]

Спустя 11 часов, 29 минут, 30 секунд (18.01.2009 - 07:48) ferol написал(а):
Цитата (Adamant @ 17.01.2009 - 17:10)

'/^[abcd]+[rt]+$/U'  - в начале строки идут  буквы из набора abcd и в конце строки идут буквы из набора rt и все! Между ними вы указали, что не должно быть ничего!

то есть результат должен быть ar. Но его не показывает. Я не стал писать все перепробованные варианты. Но я пробовал и с карманами и print_r использовал. Результат один - пусто!
PHP
$ra = 'adartwgsdhtr';
preg_match('/(^[abcd]+[rt]+$)/U', $ra, $arr);
echo '<pre>';
print_r($arr);
echo '</pre>';

пусто! Из того, что Вы объясняете, на выходе должно быть ar. Кусок текста, начинающийся на один из символов abcd и заканчивающийся на один из символов r или t.
PHP
$ra='adartwgsdhtr';
preg_match('/^[bcd]+([^\s]*)[rt]+$/U'$ra$arr);
echo '<pre>';
print_r($arr);
echo '</pre>';

Должно быть содержащееся МЕЖДУ символами. То есть a. Тоже пусто!

Цитата (Sylex @ 17.01.2009 - 17:18)
потому что символ ^ указывает, что поиск должен идти С САМОГО НАЧАЛА строки, в данном случае не подходит под шаблон.

Из написаного adamantом примера я понял, что этот символ для искомого куска, что кусок должен начинаться на [abcd] и заканчиваться на [rt].

Цитата (Sylex @ 17.01.2009 - 17:18)

поставьте конкретную задачу, в вашем первом посте совершенно непонятно зачем вы ставите [abcd]

мне нужен кусок текста котрый начинается на один из символов[abcd]
и заканчивается на один из символов [rt]
получается надо делать надо
PHP
$ra='adartwgsdhtr';
preg_match('/([abcd]+[^\s]*[rt]+)/U'$ra$arr);
echo '<pre>';
print_r($arr);
echo '</pre>';

Вот теперь все заработало как надо! Всем спасибо!
Быстрый ответ:

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