Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: разбить строку на 2 массива..
 
 автор: а-я   (02.06.2010 в 08:46)   письмо автору
 
 

есть такое задание:

/a1/b2/c3/    ->     {a,b,c}, {1,2,3}
/a1/b/c3/     ->     {a,b,c}, {1,3}
/a1/3/        ->     {a,3}, {1}


1столбец - исходные данные
2стоблец - должны получить 2 массива

  Ответить  
 
 автор: Trianon   (02.06.2010 в 10:45)   письмо автору
 
   для: а-я   (02.06.2010 в 08:46)
 

>есть такое задание:

вот эти слова пугают очень...

  Ответить  
 
 автор: а-я   (02.06.2010 в 14:49)   письмо автору
 
   для: Trianon   (02.06.2010 в 10:45)
 

>>есть такое задание:
>
>вот эти слова пугают очень...

Вы о том, что это невыполнимая задача с помощью регулярных выражений?

  Ответить  
 
 автор: Trianon   (02.06.2010 в 14:59)   письмо автору
 
   для: а-я   (02.06.2010 в 14:49)
 

отчего ж. Думаю, в самой задачке ничего сложного нет.

  Ответить  
 
 автор: а-я   (02.06.2010 в 15:04)   письмо автору
 
   для: Trianon   (02.06.2010 в 14:59)
 

ну я начал с:

preg_match_all('`([^\d]+)(\d+)`is', $string, $result);


но как сделать, что может и быть число.. а может и нет..?

  Ответить  
 
 автор: vadimka   (02.06.2010 в 15:21)   письмо автору
 
   для: а-я   (02.06.2010 в 15:04)
 

(\d+)?

  Ответить  
 
 автор: а-я   (02.06.2010 в 15:28)   письмо автору
 
   для: vadimka   (02.06.2010 в 15:21)
 

благодарю.. пришел к такому:

`([^\d\/]+)(\d+)?`is


но не выполняется послед. условие, т.е. если будет просто цифра, она должна оказаться в 1ом массиве

  Ответить  
 
 автор: Gubichev   (02.06.2010 в 15:36)   письмо автору
 
   для: vadimka   (02.06.2010 в 15:21)
 

(\d*) - так по моему проще

  Ответить  
 
 автор: Trianon   (02.06.2010 в 16:50)   письмо автору
 
   для: а-я   (02.06.2010 в 15:04)
 

[a-z]+|[0-9]+

  Ответить  
 
 автор: а-я   (02.06.2010 в 16:05)   письмо автору
 
   для: а-я   (02.06.2010 в 08:46)
 

вот если бы работали с отдельной частью, т.е. разбили по "/" то можно было использовать регулярку

^([a-z0-9]*?)([0-9]*)$


а как ее на все строку использовать?

  Ответить  
 
 автор: vadimka   (02.06.2010 в 17:22)   письмо автору
 
   для: а-я   (02.06.2010 в 16:05)
 

не уверен, пусть знающие товарищи поправят

<?php
$str
"/a1/b/c3/";
$pattern="#([a-z])([\d]?)#";
preg_match_all($pattern,$str,$out);
echo 
"<pre>";
print_r($out[1]);
echo 
"<pre>";
print_r($out[2]);
?>

  Ответить  
 
 автор: Tonik992   (02.06.2010 в 22:39)   письмо автору
 
   для: vadimka   (02.06.2010 в 17:22)
 

Да и вариант Trianon'a подходит....

Может это подойдет более менее?

<?php
$str
"/a1/3/c2/b/";
$pattern="#\/?([a-z]?)([0-9]?)\/#";
preg_match_all($pattern,$str,$out);
echo 
"<pre>";
print_r($out[1]);
echo 
"<pre>";
print_r($out[2]);
?>

  Ответить  
 
 автор: а-я   (03.06.2010 в 12:59)   письмо автору
 
   для: Tonik992   (02.06.2010 в 22:39)
 

Благодарю.. протестирую... вроде то что надо

  Ответить  
 
 автор: а-я   (03.06.2010 в 13:24)   письмо автору
 
   для: а-я   (02.06.2010 в 08:46)
 

получилось так реализовать...

\/?([a-z0-9]*?)([0-9]*?)\/


единственное, если просто число то оно оказывается во 2ом массиве а надо в первый ..

  Ответить  
 
 автор: Tonik992   (03.06.2010 в 14:39)   письмо автору
 
   для: а-я   (03.06.2010 в 13:24)
 

Тогда я вообще не понял сути твоих массивов.. Что должно быть в первом массиве, а что во втором?

  Ответить  
 
 автор: Tonik992   (03.06.2010 в 14:41)   письмо автору
 
   для: Tonik992   (03.06.2010 в 14:39)
 

$pattern="#\/?([a-z0-9]*?)([0-9]*?)\/#";

Зачем звездочки ты используешь в своей регулярке???

$pattern="#\/?([a-z0-9]?)([0-9]?)\/#"; думаю эта поможет..

  Ответить  
 
 автор: Trianon   (03.06.2010 в 17:08)   письмо автору
 
   для: а-я   (03.06.2010 в 13:24)
 

а я ведь показал, как разбирается эта штука.
Причем независимо от того, сколько там букв или цифр.

  Ответить  
 
 автор: а-я   (03.06.2010 в 20:03)   письмо автору
 
   для: Trianon   (03.06.2010 в 17:08)
 

благодарю... и Ваш вариант работает.

просто немного усложнил задачу, строка может содержать и цифры.

получается в послед. массив попадает число на которое оканчивается строка, а все остальное в первый массив.

т.е.


/a1b2c3/aa11bb22cc/ccc333/ -> {a1b2c, aa11bb22cc, ccc},  {3,333}

  Ответить  
 
 автор: Trianon   (03.06.2010 в 20:14)   письмо автору
 
   для: а-я   (03.06.2010 в 20:03)
 

А вот это - извините.
Это в грамматику с просмотром лишь на один символ вперед не вписывается ну никаким боком.
А следовательно обязано считаться ересью.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования