За последние 24 часа нас посетили 17778 программистов и 1286 роботов. Сейчас ищут 1480 программистов ...

Нумерация подмасок

Тема в разделе "Регулярные выражения", создана пользователем AndroNick, 30 янв 2007.

  1. AndroNick

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

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    Цитата из "мануала":
    ----------
    В шаблоне фрагменты выделяются при помощи скобок.
    Каждому фрагменту выделяется номер в том порядке,
    в котором они расположены
    , и соответствующая переменная
    будет содержать его значение.

    PHP:
    1.   $string = "15 apples, 2 foos, 3 bars";
    2.   while ($string =~ m/(\d+) (\w+)/g) {
    3.     print "$2: $1\n";
    4.   }
    5.   # Выведет:
    6.  # apples: 15
    7.  # foos: 2
    8.  # bars: 3
    ----------
    У меня вопрос: как "выдавать" номер каждому фрагменту самостоятельно?

    Я помню где-то вычитал что можно как-то вручную задавать номер каждой подмаске, и вот когда пришло время этим воспользоваться я забыл как это делается... Перечитал кучу мануалов и статей, но так ничего и не нашел.

    Если кто знает, подскажите пожалуйста.
     
  2. Mavir

    Mavir Guest

    Сдается мне, что это Perl.
     
  3. AndroNick

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

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    Да цитата взята из Perl.. Но не в этом суть ведь разница написания выражений невелика.
     
  4. Mavir

    Mavir Guest

    Зато велика разница между языками.
     
  5. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    а нафига?
     
  6. AndroNick

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

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    Ладно приведу другой пример:

    Допустим переменная $txt =
    Код (Text):
    1. ...
    2. [sectorobject]
    3.   [objid]id3[/objid]
    4.   [objtype]type1[/objtype]
    5.   [objclass]class2[/objclass]
    6. [/sectorobject]
    7. [sectorobject]
    8.   [objid]id4[/objid]
    9.   [objtype]type6[/objtype]
    10.   [objclass]class5[/objclass]
    11. [/sectorobject]
    12. ...
    PHP:
    1. <?php
    2. #...
    3. preg_match_all ("|(?i)\[objid\]([\w\s]*)\[/objid\][\s\S]*[\objtype\]([\w\s]*)\[/objtype\][\s\S]*\[objclass\]([\w\s]*)\[/objclass\]|", $txt, $out, PREG_SET_ORDER);
    4. #...
    5. ?>
    При сопоставлении шаблону "id", "type" и "class" пронумеруются попорядку. А что нужно добавить в выражение чтоб пронумеровать фрагменты по-своему? (это точно возможно, я читал где-то но забыл где)
     
  7. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
     
  8. AndroNick

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

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    А нафига тебе "нафига"?
    Если знаешь как - ответь, а если нет "нафига?" не поможет.
     
  9. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    ты сначала обоснуй свое стремление к собственной нумерации подмасок. какая принципиальная разница в использовании $out[0][1] или $out[0][2]?
     
  10. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    AndroNick
    Люди правы, сложно ответить на вопрос, когда непонятно, что именно ты хочешь сделать.
    Если ты хочешь своим "сущностям" задать некое подобие весов, и например отсортировать их потом по этим весам - то лучше разобрать свою строку, превратить ее в массив, и воспользоваться функцией usort(), написав свою функцию для сравнения, которая будет учитывать эти веса. Если тебе нужно что-то другое - описывай проблему подробнее. ;)
     
  11. AndroNick

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

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    Ок..
    Всем спассибо..
    Тема закрыта..