Intereting Posts
PHP: возвращает все даты между двумя датами в массиве PHP createFromFormat для версии 5.2 Переопределение констант класса и свойств Отображение имени входа в систему в WordPress Menu PHP proc_open не будет работать – дает мне «Недостающий определитель дескриптора в массиве» В PHP значение 0 (int, ноль) равно «первым» или «последнему» (строки)? как сохранить выбранные значения в поле «Выбрать» после отправки формы? Нужно ли иметь wsdl-файл для создания веб-службы в php? Обновление базы данных SQL с использованием значений флажка изменить два html id с одной функцией ajax Я не получаю цены с API рекламы продукта Amazon PHP: Правильное регулярное выражение для того, чтобы каждая буква слева от первого нижнего регистра двоеточия UTF-8 символов в preg_match_all (PHP) Модуль PDO уже загружен в Unknown в строке 0 в настройке laravel на ubuntu Доступ к нескольким иностранным полям в виртуальном поле?

Именованные обратные ссылки с preg_replace

Довольно просто; Я не могу найти что-либо окончательное относительно PHP preg_replace() поддерживающего именованные preg_replace() :

 // should match, replace, and output: user/profile/foo $string = 'user/foo'; echo preg_replace('#^user/(?P<id>[^/]+)$#Di', 'user/profile/(?P=id)', $string); 

Это тривиальный пример, но мне интересно, просто ли этот синтаксис (?P=name) просто не поддерживается. Синтаксическая проблема или несуществующая функциональность?

Они существуют:

http://www.php.net/manual/en/regexp.reference.back-references.php

С preg_replace_callback:

 function my_replace($matches) { return '/user/profile/' . $matches['id']; } $newandimproved = preg_replace_callback('#^user/(?P<id>[^/]+)$#Di', 'my_replace', $string); 

Или еще быстрее

 $newandimproved = preg_replace('#^user/([^/]+)$#Di', '/user/profile/$1', $string); 

preg_replace не поддерживает именованные preg_replace .

preg_replace_callback поддерживает именованные preg_replace_callback , но после PHP 5.3, поэтому ожидайте, что он завершится неудачей на PHP 5.2 и ниже.

preg_replace еще не поддерживает именованные подшаблоны.

вы можете использовать это:

 class oreg_replace_helper { const REGEXP = '~ (?<!\x5C)(\x5C\x5C)*+ (?: (?: \x5C(?P<num>\d++) ) | (?: \$\+?{(?P<name1>\w++)} ) | (?: \x5Cg\<(?P<name2>\w++)\> ) )? ~xs'; protected $replace; protected $matches; public function __construct($replace) { $this->replace = $replace; } public function replace($matches) { var_dump($matches); $this->matches = $matches; return preg_replace_callback(self::REGEXP, array($this, 'map'), $this->replace); } public function map($matches) { foreach (array('num', 'name1', 'name2') as $name) { if (isset($this->matches[$matches[$name]])) { return stripslashes($matches[1]) . $this->matches[$matches[$name]]; } } return stripslashes($matches[1]); } } function oreg_replace($pattern, $replace, $subject) { return preg_replace_callback($pattern, array(new oreg_replace_helper($replace), 'replace'), $subject); } 

то вы можете использовать либо \g<name> ${name} or $+{name} качестве ссылки в операторе replace.

cf ( http://www.rexegg.com/regex-disambiguation.html#namedcapture )