From 0c155dd7b7370f2248fc7e3f56da43e8f2a37e18 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. Signed-off-by: Andrew Fuerste-Henry Signed-off-by: Nick Clemens Signed-off-by: Fridolin Somers --- 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.39.5