За последние 24 часа нас посетили 18042 программиста и 1590 роботов. Сейчас ищут 1152 программиста ...

Замена как ключ ассоциативного массива

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

  1. Alien2001

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

    С нами с:
    5 дек 2012
    Сообщения:
    4
    Симпатии:
    0
    Добрый день!

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

    Eсть кусок кода в переменной $top:
    Код (Text):
    1.  
    2. <option value="u">{Unknown}</option>
    3. <option value="m" selected="selected">{Male}</option>
    4. <option value="f">{Female}</option>
    Есть ассоциативный массив:
    Код (Text):
    1. $text= array ('Male'=> "мужчина", 'Female' => "женщина", 'Unknown' => "оно");
    Хочется заменить в куске кода значения option на понятные русские.
    Пытался сделать так:
    Код (Text):
    1. $top = preg_replace("|{(.*?)}|s",$text['\\1'],$top);
    Не работает :(
     
  2. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Код (PHP):
    1. <?php
    2. $opinions= array ('Male'=> "мужчина", 'Female' => "женщина", 'Unknown' => "оно");
    3.  
    4. $patterns = array_keys($opinions);
    5. $values = array_values($opinions);
    6.  
    7. foreach ($patterns as &$pattern){
    8.         $pattern = '/(^|[^\w])(' . preg_quote($pattern) . ')/Ui';
    9. }
    10.  
    11. foreach ($values as &$value){
    12.         $value = '\1' . $value;
    13. }
    14.  
    15. $text = "Male is  Female or .unknown or unknown Male or 'Female'";
    16. $result = preg_replace($patterns, $values, $text);
    17.  
    18. echo $result  ."\n"; 
     
  3. Alien2001

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

    С нами с:
    5 дек 2012
    Сообщения:
    4
    Симпатии:
    0
    Спасибо большое!

    Правильно я понимаю, что подстановку (\1) в качестве ключа использовать никак нельзя? Дело в том, что не хотелось бы перебирать весь массив значений, он может быть очень большим, а на практике нужно использовать оттуда лишь отдельные значения.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    можно без прегреплейса, но ключи должны быть c {
     
  5. Alien2001

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

    С нами с:
    5 дек 2012
    Сообщения:
    4
    Симпатии:
    0
    А можно поподробнее? Нужно решить задачу без перебора массива значений, просто подставив конкретное значение по ключу.
    И как без прегреплейса (или прегматча) найти то, что надо заменить? У меня в примере, кстати, значения не зря были в { }, иначе их сложно выискать.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  7. Alien2001

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

    С нами с:
    5 дек 2012
    Сообщения:
    4
    Симпатии:
    0
    Если кому-то потребуется нечто похожее, решил проблему так:

    $top = preg_replace("|{(.*?)}|se","\$text['\\1']",$top);

    Чтобы конструкция $text['\\1'] заработала, ее нужно поставить в кавычки и перед ней должен быть \
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    забавно, прикольное решение =)