From 31befa295ee38bc850792b3612180b61462df587 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Mon, 13 Dec 2021 09:59:15 +0000 Subject: [PATCH] Bug 23873: Enable capture groups in MarcModificationTemplates This patch adds support for regular expression capture groups in MarcModificationTemplates. We escape double quotes in the replacement string, then quote the whole string before applying the `ee` modifier to the final regex application. See https://blog.james.rcpt.to/2010/10/25/perl-search-and-replace-using-variables/ for further details. Test plan 1) Attempt to use capture groups in your regular expression based MarcModificationTemplate and note it does not work. 2) Apply the patch and try again, this time the capture group should yield the expected results. 3) Run t/SimpleMARC.t and confirm the tests still pass. --- Koha/SimpleMARC.pm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Koha/SimpleMARC.pm b/Koha/SimpleMARC.pm index a501a9441f..6fd08b1013 100644 --- a/Koha/SimpleMARC.pm +++ b/Koha/SimpleMARC.pm @@ -636,6 +636,9 @@ sub _modify_values { my $regex = $params->{regex}; if ( $regex and $regex->{search} ) { + my $replace = $regex->{replace}; + $replace =~ s/"/\\"/g; # Protection from embedded code + $replace = '"' . $replace . '"'; # Put in a string for /ee $regex->{modifiers} //= q||; my @available_modifiers = qw( i g ); my $modifiers = q||; @@ -645,16 +648,16 @@ sub _modify_values { } foreach my $value ( @$values ) { if ( $modifiers =~ m/^(ig|gi)$/ ) { - $value =~ s/$regex->{search}/$regex->{replace}/ig; + $value =~ s/$regex->{search}/$replace/igee; } elsif ( $modifiers eq 'i' ) { - $value =~ s/$regex->{search}/$regex->{replace}/i; + $value =~ s/$regex->{search}/$replace/iee; } elsif ( $modifiers eq 'g' ) { - $value =~ s/$regex->{search}/$regex->{replace}/g; + $value =~ s/$regex->{search}/$replace/gee; } else { - $value =~ s/$regex->{search}/$regex->{replace}/; + $value =~ s/$regex->{search}/$replace/ee; } } } -- 2.20.1