我正在尝试在字符串中搜索子字符串并突出显示搜索文本。到目前为止我所拥有的是:
$text = 'Guitar';
$search = 'guit';
使用下面的代码我会返回字符串' guitar'与' guit'突出显示,但我想返回原来的' Guit'以首都G'突出显示。任何帮助将不胜感激。
my $replace = "<span style='color:white;background- color:red'>$search</span>";
$text =~ s/$search/$replace/gi;
答案 0 :(得分:0)
使用$&
, which will be set to the matched string:
i
更新:这不会起作用,因为@ThisSuitIsBlackNot评论如下:当该字符串是变量时,my $text = "Albert Hammond's guitar from Gibraltar.";
foreach my $text ('guitar', 'Gibraltar') {
my $replace = "<span style='color:white;background-color:red'>" . $& . "</span>";
$text =~ s/$search/$replace/gi;
}
将不会在替换字符串中被解释。 (我不知道这一点。)所以你必须摆脱变量:
$&
打印
my $text = "Albert Hammond's guitar from Gibraltar.";
foreach my $search ('guitar', 'Gibraltar') {
my $replace = "";
$text =~ s/$search/<span style='color:white;background-color:red>$&<\/span>/gi;
}
请注意,我还必须转义替换字符串中的Albert Hammond's <span style='color:white;background-color:red>guitar</span> from <span style='color:white;background-color:red>Gibraltar</span>.
,因为/
也用于分隔/
命令的参数。
这可能还不够好。
假设您s
的值绝不会包含正则表达式特有的任何字符(例如$search
或.
)。
如果可能,您可以使用qr
来逃避它们。
它还假设这些值从不包含XML特有的任何字符(例如*
或<
或我的示例中的>
。)。如果可能,请使用XML::LibXML等XML操作库进行更改,或使用XSLT。
答案 1 :(得分:0)
这就是诀窍。
node.js
答案 2 :(得分:0)
通过要求将替换字符串保存在标量变量中,您已经使自己变得困难了。没有那个
$text =~ s{($search)}{<span style='color:white;background-color:red'>$1</span>}gi;
可以正常工作
因为你需要/ee
eval表达式修饰符,就像这样
use strict;
use warnings;
use 5.010;
my $text = 'Guitar';
my $search = 'guit';
my $replace = q{<span style='color:white;background-color:red'>$1</span>};
$text =~ s/($search)/ "qq{$replace}" /eegi;
say $text
<span style='color:white;background-color:red'>Guit</span>ar