Добрый день! Подскажите, пожалуйста, можно ли использовать найденное в регулярных выражениях значение, как ключ ассоциативного массива для замены. Eсть кусок кода в переменной $top: Код (Text): <option value="u">{Unknown}</option> <option value="m" selected="selected">{Male}</option> <option value="f">{Female}</option> Есть ассоциативный массив: Код (Text): $text= array ('Male'=> "мужчина", 'Female' => "женщина", 'Unknown' => "оно"); Хочется заменить в куске кода значения option на понятные русские. Пытался сделать так: Код (Text): $top = preg_replace("|{(.*?)}|s",$text['\\1'],$top); Не работает
Код (PHP): <?php $opinions= array ('Male'=> "мужчина", 'Female' => "женщина", 'Unknown' => "оно"); $patterns = array_keys($opinions); $values = array_values($opinions); foreach ($patterns as &$pattern){ $pattern = '/(^|[^\w])(' . preg_quote($pattern) . ')/Ui'; } foreach ($values as &$value){ $value = '\1' . $value; } $text = "Male is Female or .unknown or unknown Male or 'Female'"; $result = preg_replace($patterns, $values, $text); echo $result ."\n";
Спасибо большое! Правильно я понимаю, что подстановку (\1) в качестве ключа использовать никак нельзя? Дело в том, что не хотелось бы перебирать весь массив значений, он может быть очень большим, а на практике нужно использовать оттуда лишь отдельные значения.
А можно поподробнее? Нужно решить задачу без перебора массива значений, просто подставив конкретное значение по ключу. И как без прегреплейса (или прегматча) найти то, что надо заменить? У меня в примере, кстати, значения не зря были в { }, иначе их сложно выискать.
сложно, т.к. могут быть совпадения ненужные. но либо убирай скобки, либо добавляй скобки в ключи и http://www.php.ru/manual/function.str-replace.html
Если кому-то потребуется нечто похожее, решил проблему так: $top = preg_replace("|{(.*?)}|se","\$text['\\1']",$top); Чтобы конструкция $text['\\1'] заработала, ее нужно поставить в кавычки и перед ней должен быть \