2015-10-06 85 views
3

擴大了雙引號我怎樣才能得到的Perl:擺脫從變量

my $name = 'John "FOO" Rambo';

擴大在

<span title=\"The great and mighty $name\"

要像

<span title=\"The great and mighty John \"FOO\" Rambo\"</span>

而不是

<span title=\"The great and mighty John "FOO" Rambo\"

這樣生成頁面時,我的HTML標記沒有被破壞和名稱包含"

+2

'$ name =〜s /「/ \\」/ g;'? – rbm

+0

@rbm確實有效。從來沒有處理Perl之前:)你可以請張貼作爲答案?這看起來很像一些sed表達式。你能否詳細說明最後的'g'?謝謝。 – Zloj

+0

確定 - 在下面發佈解釋 – rbm

回答

-2

正確的HTML代碼將通過在你原來的問題使用&quot;

my $name = 'John "FOO" Rambo'; 
$name =~ s/"/&quot;/g; 
my $html = "<span title=\"The great and mighty $name\"/>"; 
print $html ."\n"; 

對於澄清產生:

您可以使用簡單的正則表達式來代替引號。 例:

my $name = 'John "FOO" Rambo'; 
$name =~ s/"/\\"/g; 
my $html = "<span title=\"The great and mighty $name\"/>"; 
print $html ."\n"; 

$name =~ s/"/\\"/g; 

簡單地說,與\"替換所有"(但由於\是特殊字符需要被轉義爲\\"

g意味着globally,即所有發生在字符串內的事件。

(即如果你只運行$name =~ s/"/\\"/;然後$nameJohn \"FOO" Rambo,但g它是John \"FOO\" Rambo

但是這不會產生有效的HTML

2

正確的HTML將是以下幾點:

<span title="The great and mighty John &quot;FOO&quot; Rambo">...</span> 

您可以使用以下方式獲取它:

use HTML::Entities qw(encode_entities); 

my $html = '<span title="' . encode_entities("The great and mighty $name") . '">...</span>'; 
    -or- 
my $html = '<span title="The great and mighty ' . encode_entities($name) . '">...</span>'; 

您應該使用模板系統。如果您使用Template-Toolkit,模板將爲

<span title="The great and mighty [% name | html %]">...</span> 
+0

而這整個過程中,我已經手動轉義HTML實體,然後再將它們傳遞給TT。我應該知道這將建在...時間閱讀一些文檔。 – ThisSuitIsBlackNot

+1

@ThisSuitIsBlackNot,這是一個內置的FILTER。它不會脫離單引號,因此您需要爲屬性值分隔符使用雙引號。 – ikegami