置換文字列で名前付きグループを使用するにはどうすればよいですか?
この式は、名前付きグループを作成します。
$re= "/(?P<name>[0-9]+)/";
この式を置き換えたいのですが、動作しません。
preg_replace($re, "\{name}", $text);
できません-で使用できるのは数値の一致名のみ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, $limit = -1, &$count = 0) {
return preg_replace_callback($pattern, array(new oreg_replace_helper($replace), 'replace'), $subject, $limit, $count);
}
次に、replaceステートメントの参照として\ g${name}または$+{name}のいずれかを使用できます。
cf(http://www.rexegg.com/regex-disambiguation.html#namedcapture)