За последние 24 часа нас посетили 20089 программистов и 1670 роботов. Сейчас ищут 1856 программистов ...

БАЯН так тему называть но "ПАМАГИТЕ СОСТАВИТЬ РЕГ. ВЫРА

Тема в разделе "Регулярные выражения", создана пользователем Panter7777, 24 дек 2010.

  1. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Добрый день!

    Есть записи вот такого формата:

    milo-33-2-P-s
    rudn-6-4-P-s
    mz-8v-5-P-new-s2
    ahm-5-9-P-s
    ob-28a-P-new-s
    mish-1`4-4-P-s
    mish-1`40-4-P-s
    grig-41-1-P-s
    budsh-9`40-4-p-s
    rad-26-1-p-s
    gs-15b-2-P-new-s2
    ob-45`28-2-P-s3
    grig-39a-2-P-s
    mm-27b-2-P-new-s

    нужно составить рег. вырвжение что бы
    $aOne= только milo rudn mz ahm ob mish grig (я так понимаю это [a-z]{1,5}) - только все что сначала до черточки, а второе
    $aTwo= все остальное -33-2-P-s -6-4-P-s -8v-5-P-new-s2 -5-9-P-s -1`40-4-P-s

    За ранее благодарин
     
  2. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    как раз второе оказалось легче "/-\S+-*-*-*/"
    а с первым как быть????
     
  3. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    /^(milo|udn|mz|ahm|ob|mish|grig)/
     
  4. Dima4321

    Dima4321 Активный пользователь

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    PHP:
    1. <?php
    2. ini_set('display_errors',1);
    3.  
    4. setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');
    5.  
    6. $m ="milo-33-2-P-s
    7. rudn-6-4-P-s
    8. mz-8v-5-P-new-s2
    9. ahm-5-9-P-s
    10. ob-28a-P-new-s
    11. mish-1`4-4-P-s
    12. mish-1`40-4-P-s
    13. grig-41-1-P-s
    14. budsh-9`40-4-p-s
    15. rad-26-1-p-s
    16. gs-15b-2-P-new-s2
    17. ob-45`28-2-P-s3
    18. grig-39a-2-P-s
    19. mm-27b-2-P-new-s";
    20.  
    21.  
    22. $poisk='/(-.+?(?:s|2|3))/si';
    23.  
    24. preg_match_all($poisk,$m,$matches);
    25.  
    26. echo $matches[1][0];
    27. echo $matches[1][1];
    28. echo $matches[1][2];
    29. echo $matches[1][3];
    30. echo $matches[1][4];
    31. echo $matches[1][5];
    32. echo $matches[1][6];
    33. // и т.д
    34.  
    35.  
    36. ?>
     
  5. Dima4321

    Dima4321 Активный пользователь

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    PHP:
    1. <?php
    2. ini_set('display_errors',1);
    3.  
    4. setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');
    5.  
    6. $m ="milo-33-2-P-s
    7. rudn-6-4-P-s
    8. mz-8v-5-P-new-s2
    9. ahm-5-9-P-s
    10. ob-28a-P-new-s
    11. mish-1`4-4-P-s
    12. mish-1`40-4-P-s
    13. grig-41-1-P-s
    14. budsh-9`40-4-p-s
    15. rad-26-1-p-s
    16. gs-15b-2-P-new-s2
    17. ob-45`28-2-P-s3
    18. grig-39a-2-P-s
    19. mm-27b-2-P-new-s";
    20.  
    21.  
    22. $poisk='/(?<![-ne])([a-z]{2,7})/si';
    23.  
    24. preg_match_all($poisk,$m,$matches);
    25.  
    26. echo $matches[1][0];
    27. echo '<br>';
    28. echo $matches[1][1];
    29. echo '<br>';
    30. echo $matches[1][2];
    31. echo '<br>';
    32. echo $matches[1][3];
    33. echo '<br>';
    34. echo $matches[1][4];
    35. echo '<br>';
    36. echo $matches[1][5];
    37. echo '<br>';
    38. echo $matches[1][6];
    39. // и т.д
    40.  
    41.  
    42. ?>
     
  6. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Это вообще не то так как записей более 1000.


    To Dima4321--
    Не понимаю как работают твои $poisk='/(?<![-ne])([a-z]{2,7})/si'; // рег. выражения.

    Но сам метод тоже не подойдет.

    Мне нужно на автомате много записей обработать,.. Осталось только

    $aOne= только milo rudn mz ahm ob mish grig (я так понимаю это [a-z]{1,5}) - только все что сначала до черточки, а второе или как его сделать??
     
  7. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Вот такое выражение работает ("[^-\S][a-z]{1,}[^-]{1}") но не берет первую запись(((

    тоесть выводит rudn mz ahm ob mish grig, а самую первую "milo" не хочет, блин хелп!
     
  8. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
  9. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    #^([^-]+)(.+)$#m - выражение работает но одно дает возможность брать по три записи из каждой:

    1 : milo-33-2-P-s
    1.1 : milo
    1.2 : -33-2-P-s
    .......и т далее. но я использую
    Код (Text):
    1. $list = join($char);       
    2. //print ($list);
    3. $char1 = preg_split("/-\S+-*-*-*/", $list, -1, PREG_SPLIT_NO_EMPTY);
    4. $char2 = preg_split("#^([^-]+)(.+)$#m", $list);
    а не preg_match где можно указать что-то типа
    Код (Text):
    1. $char2 = preg_match("#^([^-]+)(.+)$#m", $list, $reg)
    а потом использовать $reg[1] - для вывода именно второй записи ("1.1 : milo")((((
    по этому и не подходит но спасибо за ответ.
     
  10. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    А как сделать выражение "не символ" мне нужно выражение типо "(не "-")[a-z]{2,5}(исключить любые символы в любом количестве)"
     
  11. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    А еще забыл сказать передаеться не через "\n"(новая строчка) список а в строчку, вот так

    Код (Text):
    1. ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s rudn-6-4-P-s mz-8v-5-P-new-s2 ahm-5-9-P-s ob-28a-6-P-new-s mish-1`4-4-P-s grig-41-1-P-s budsh-9`40-4-p-s rad-26-1-p-s gs-15b-2-P-new-s2 ob-45`28-2-P-s3 grig-39a-2-P-s mm-27b-2-P-new-s gd-63-2-P-s
    вот работает но не берет самое первое выражение:
    Код (Text):
    1. "[a-z]{1,}[^-]{1}"
    2. //выдает
    3. Всего совпадений 22
    4.  
    5. 1 : bl
    6. 2 : gd
    7. 3 : mm
    8. 4 : hsh
    9. 5 : mish
    10. 6 : gs
    11. 7 : ob
    12. 8 : lysk
    13. 9 : milo
    14. 10 : rudn
    15. 11 : mz
    16. 12 : ahm
    17. 13 : ob
    18. 14 : mish
    19. 15 : grig
    20. 16 : budsh
    21. 17 : rad
    22. 18 : gs
    23. 19 : ob
    24. 20 : grig
    25. 21 : mm
    26. 22 : gd
    всего 22 из 23 выражений
     
  12. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    вообще всю эту штуку можно разбить с помощью explode по пробелу, а затем каждую запись по дефису. и будет тебе щастье :)
     
  13. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Ведь так и сделал вот :
    Код (Text):
    1. $list = join($char);       
    2. print ($list);
    3. $char1 = preg_split("/-\S+-*-*-*/", $list, -1, PREG_SPLIT_NO_EMPTY);
    4. $char2 = preg_split("/[^-\S][a-z]{1,}[^-]{1}/", $list);
    вот join делает по пробелу (10 записей):
    Код (Text):
    1. ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s
    а теперь разбиваю на две части одна берет только бувы в начале:
    1. тут все как нужно
    Код (Text):
    1. $char1 = preg_split("/-\S+-*-*-*/", $list, -1, PREG_SPLIT_NO_EMPTY);
    2. // выводит
    3. Array ( [0] => ob [1] => bl [2] => gd [3] => mm [4] => hsh [5] => mish [6] => gs [7] => ob [8] => lysk [9] => milo )
    2. Должна выводить все остальное кроме первых букв, но...
    Код (Text):
    1.  
    2. $char2 = preg_split("/[^-\S][a-z]{1,}[^-]{1}/", $list);
    3. Array ( [0] => ob-28b-1-P-new-s2 [1] => -82-1-p-s [2] => -47-1-P-new-s [3] => -11b-5-P-new-s [4] => -21`6-4-P-s [5] => -11-1-P-s [6] => -46a-1-P-new-s2 [7] => -5a-2-P-new-s3 [8] => -8`24-3-p-s [9] => -33-2-P-s )
    тут обрати внимание на первую запись!!! И как это побороть ... капец вообщем. НИД ХЭЛП!
     
  14. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Panter7777
    по-мойму ты зря ринулся сразу в регулярки. Это всё можно сделать более простым способом:

    PHP:
    1.  
    2. <?php
    3.  
    4. $text = 'ob-28b-1-P-new-s2      
    5. bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s';
    6.  
    7. $matches = explode(' ', preg_replace('#\s+#s', ' ', $text));
    8. for($i = 0; $i < count($matches); $i++){
    9.   $matches[$i] = explode('-', $matches[$i]);
    10. }
    11.  
    12. echo '<pre>'.print_r($matches, true).'</pre>';
    13.  
    14.  
    15. ?>
    16.  


    upd. хотя с помощью регулярки выглядит лучше :)

    PHP:
    1.  
    2. <?php
    3.  
    4. $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s';
    5.  
    6. preg_match_all('#[a-z]+(-[^ ]+)(?:\s|$)#sUi', $text, $matches);
    7.  
    8. echo '<pre>'.print_r($matches, true).'</pre>';
    9.  
    10. ?>
    11.  
     
  15. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев



    Ну ... как сказать... ты разбил все по символам и загнал все в массив, но потом как мне вытягивать то что нужно если поля массива разные:

    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [0] => ob
    6.             [1] => 28b
    7.             [2] => 1
    8.             [3] => P
    9.             [4] => new
    10.             [5] => s2
    11.         )
    12.  
    13.     [1] => Array
    14.         (
    15.             [0] => bl
    16.             [1] => 82
    17.             [2] => 1
    18.             [3] => p
    19.             [4] => s
    20.         )
    21.  
    22.     [2] => Array
    23.         (
    24.             [0] => gd
    25.             [1] => 47
    26.             [2] => 1
    27.             [3] => P
    28.             [4] => new
    29.             [5] => s
    30.         )
    Напимер нулевой и первый сравнить там 5 состовляющих, а во 1-м 4. А ведь записей будет более 1000 [/code]
     
  16. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    PHP:
    1.  
    2. <?php
    3.  
    4. $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s';
    5.  
    6. preg_match_all('#[a-z]+(-[^ ]+)(?:\s|$)#sUi', $text, $matches);
    7.  
    8. echo '<pre>'.print_r($matches[1], true).'</pre>';
    9.  
    10. ?>
    11.  
    ?
     
  17. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    так.. сейчас попробую
     
  18. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    супер!!!

    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [0] => ob-28b-1-P-new-s2
    6.             [1] => bl-82-1-p-s
    7.             [2] => gd-47-1-P-new-s
    8.             [3] => mm-11b-5-P-new-s
    9.             [4] => hsh-21`6-4-P-s
    10.             [5] => mish-11-1-P-s
    11.             [6] => gs-46a-1-P-new-s2
    12.             [7] => ob-5a-2-P-new-s3
    13.             [8] => lysk-8`24-3-p-s
    14.             [9] => milo-33-2-P-s
    15.         )
    16.  
    17.     [1] => Array
    18.         (
    19.             [0] => -28b-1-P-new-s2
    20.             [1] => -82-1-p-s
    21.             [2] => -47-1-P-new-s
    22.             [3] => -11b-5-P-new-s
    23.             [4] => -21`6-4-P-s
    24.             [5] => -11-1-P-s
    25.             [6] => -46a-1-P-new-s2
    26.             [7] => -5a-2-P-new-s3
    27.             [8] => -8`24-3-p-s
    28.             [9] => -33-2-P-s
    29.         )
    30.  
    31. )
    а вот точно так же только, чтоб один массив был начало (название) а второй все остальное!!!:
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [0] => ob
    6.             [1] => bl
    7.             [2] => gd
    8.             [3] => mm
    9.             [4] => hsh
    10.             [5] => mish
    11.             [6] => gs
    12.             [7] => ob
    13.             [8] => lysk
    14.             [9] => milo
    15.         )
    16.  
    17.     [1] => Array
    18.         (
    19.             [0] => -28b-1-P-new-s2
    20.             [1] => -82-1-p-s
    21.             [2] => -47-1-P-new-s
    22.             [3] => -11b-5-P-new-s
    23.             [4] => -21`6-4-P-s
    24.             [5] => -11-1-P-s
    25.             [6] => -46a-1-P-new-s2
    26.             [7] => -5a-2-P-new-s3
    27.             [8] => -8`24-3-p-s
    28.             [9] => -33-2-P-s
    29.         )
    30.  
    31. )
    вот можешь помочь сделать?
     
  19. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    PHP:
    1. <?php
    2.  
    3. $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s';
    4.  
    5. $matches = explode(' ', preg_replace('#\s+#s', ' ', $text));
    6. $result = array();
    7. for($i = 0; $i < count($matches); $i++){
    8.   if($matches[$i] == '') continue;
    9.   $temp = explode('-', $matches[$i], 2);
    10.   $result[] = '-'.$temp[1];
    11. }
    12.  
    13. echo '<pre>'.print_r($result, true).'</pre>';
    14.  
    15. ?>
    используя простой explode
     
  20. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    PHP:
    1.  
    2. <?php
    3.  
    4. $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s';
    5.  
    6. preg_match_all('#([a-z]+)(-[^ ]+)(?:\s|$)#sUi', $text, $matches);
    7.  
    8. echo '<pre>'.print_r($matches[1], true).'</pre>';
    9. echo '<pre>'.print_r($matches[2], true).'</pre>';
    10.  
    11. ?>
    12.  
     
  21. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Супер то что нужно спасибо, огромное!
     
  22. Panter7777

    Panter7777 Активный пользователь

    С нами с:
    10 окт 2010
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Киев
    Странный момент, если я даю иммено в таком виде:
    Код (Text):
    1. $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s';
    то работает, а если в таком через <textarea>списком:

    Код (Text):
    1.  
    2.  
    3. $street = $_POST['street'];
    4. function AddToArray($data)
    5. {
    6.         for ($i=0; $i<count($data); $i++){
    7.         $char = explode("\n", $data);
    8.                          }
    9.  
    10.  
    11. $list = join($char);       
    12. print ($list);
    13.  
    14. AddToArray ($street);
    причем print($list); вот
    Код (Text):
    1. ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s
    и в коде
    Код (Text):
    1. preg_match_all('#([a-z]+)(-[^ ]+)(?:\s|$)#sUi', $text, $matches);
    $text меняю на $list, то не работает!!!!
     
  23. Dima4321

    Dima4321 Активный пользователь

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Вот тебе на автомат !
    Лови ))
    Код (Text):
    1. <?php
    2.  
    3. ini_set('display_errors',1);
    4. error_reporting(E_ALL);
    5.  
    6. setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');
    7.  
    8. $m ="milo-33-2-P-s
    9. rudn-6-4-P-s
    10. mz-8v-5-P-new-s2
    11. ahm-5-9-P-s
    12. ob-28a-P-new-s
    13. mish-1`4-4-P-s
    14. mish-1`40-4-P-s
    15. grig-41-1-P-s
    16. budsh-9`40-4-p-s
    17. rad-26-1-p-s
    18. gs-15b-2-P-new-s2
    19. ob-45`28-2-P-s3
    20. grig-39a-2-P-s
    21. mm-27b-2-P-new-s";
    22.  
    23.  
    24. $poisk='/(?<![-ne])([a-z]{2,7})/si';  // (?<![-ne])-позиционная проверка. Чтобы не захватывало слово new
    25.  
    26.  
    27. $keywords = preg_split("/[\s]+/", $m );
    28. $count=count($keywords);
    29.    
    30.  
    31. $new=preg_match_all($poisk,$m,$matches);
    32.  
    33. $i=0;
    34.  while($i<$count) //
    35.  
    36. {
    37.  
    38. echo $matches[1][$i];
    39. echo "<br>";
    40. $i++;
    41. }
    42.  
    43.   ?>
     
  24. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    ох как эти цифры уже примелькались... Я уж и не спрашиваю откуда ни берутся.
     
  25. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    это уже вопрос не по регулярным выражениями. разбирайся сам.
    воспользуйся командой echo '<pre>'.print_r($list, true).'</pre>';