2016-10-11 111 views
1

我試圖替換所有``用HTML代碼標籤添加HTML到perl正則表達式

取代:

$string = "Foo `FooBar` Bar"; 

有:

$string = "Foo <code>FooBar</code> Bar"; 

我想這些

$pattern = '`(.*?)`'; 

my $replace = "<code/>$&</code>"; 
$subject =~ s/$pattern/$replace/im; 

#And 

$subject =~ s/$pattern/<code/>$&</code>/im; 

但它們都不起作用。

+0

心靈的斜線。 –

+3

你的字符串在'$ string'中,但是你在'$ subject'上執行了///'。你能顯示你的實際代碼嗎?你能證明哪些是行不通的嗎? – Schwern

+2

這是Markdown嗎?如果是這樣,請查看[Text :: Markdown](https://metacpan.org/pod/Text::Markdown)。 – ThisSuitIsBlackNot

回答

4

假設你的意思是$string而不是$subject ...

use strict; 
use warnings; 
use v5.10; 

my $string = "Foo `FooBar` Bar"; 

my $pattern = '`(.*?)`'; 
my $replace = "<code/>$&</code>"; 

$string =~ s{$pattern}{$replace}im; 
say $string; 

這導致...

$ perl ~/tmp/test.plx 
Use of uninitialized value $& in concatenation (.) or string at /Users/schwern/tmp/test.plx line 9. 
Foo <code/></code> Bar 

這裏有一些問題。首先,$&表示最後一場比賽匹配的字符串。那將是`FooBar`的全部。你只需要FooBar這是捕獲parens。你可以通過$1獲得。見Extracting Matches in the Perl Regex Tutorial

其次是$&$1是變量。如果你把它們放在雙引號中,例如$replace = "<code/>$&</code>"那麼Perl會立即插值它們。這意味着$replace<code/></code>。這是警告來自的地方。如果你想使用$1它必須直接進入替換。

最後,在引用正則表達式時,最好使用qr{}。這是特殊的正則表達式引用。它避免了各種引用問題。

把它放在一起......

use strict; 
use warnings; 
use v5.10; 

my $string = "Foo `FooBar` Bar"; 

my $pattern = qr{`(.*?)`}; 
$string =~ s{$pattern}{<code/>$1</code>}im; 

say $string; 
+0

是否有任何其他方式使用'$ 1'而不直接替換。就像''替換='$i'' –

+0

@ChrysUgwu是的,但我不推薦它***,因爲它是一個安全漏洞。如果使用s {} {} e',右邊將被評估爲好像它是代碼。但是現在你很容易受到代碼注入的影響。它像插值一樣工作。 '我的$ foo = 23;我的$ bar = q [this $ foo];打印「$ bar」'會說'this $ foo'。但是如果你打印eval qq [「$ bar」]'你得到'這個23'',但'$ bar'可以包含任何代碼。 – Schwern

+0

所以Perl dosnt提供任何像php一樣的安全模式替換? http://php.net/manual/en/function.preg-replace.php –