保护cetain实体不被编码算法

时间:2016-08-19 01:06:20

标签: regex perl

我有一个字符串,可以通过函数encode_entities进行解析。我需要保留双引号和单引号不被编码,所以我尝试用标志替换这些字符,然后在编码函数调用之后我们用双引号和单引号字符替换标志,未编码

这是我的策略:

// this is a value in the database
my $comment = "<br/>Test<br/>[url=#|onclick="printcoupon('3569')"]test comment[/url]";
$comment =~ s/"/[dq]/g;
$comment =~ s/'/[sq]/g;
$comment = encode_entities($comment);
if(index($comment,"onclick") != -1){
 my $start = index($comment,"onclick=");
 my $length = index($comment,"\"]");
 my $newStr = substr($comment,$start,$length-$start+1);
 $comment =~ s!\[url=(.+?)\](.+?)\[\/url\]!<a href="#" style="text-decoration:none;color:#336699" $newStr>$2</a>!g;
} else {
 $comment =~ s!\[url=(.+?)\](.+?)\[\/url\]!<a href="$1" style="text-decoration:none;color:#336699">$2</a>!g;
}
$comment =~ s/\[dq\]/"/g;
$comment =~ s/\[sq\]/'/g;

此代码不起作用,但是我的策略。没有这些替换呼叫,最终结果是:

<a href="#" style="text-decoration:none;color:#336699" onclick=&quot;printcoupon(&#39;3569&#39;)>test comment</a>

什么时候应该

<a href="#" style="text-decoration:none;color:#336699" onclick="printcoupon('3569')">test comment</a>

此外,您可以看到printcoupon函数文本调用的结束双引号不存在

我需要帮助,因为我仍然是非常新的perl用户

更新

$comment =~ s/&quot;/"/g;
$comment =~ s/&#39;/'/g;

似乎工作但它仍然没有结束双引号

1 个答案:

答案 0 :(得分:0)

可以重置转换表中的值(char2entity哈希)。

use HTML::Entities;
$HTML::Entities::char2entity{'\''} = '\'';
$HTML::Entities::char2entity{'"'} = '"';


my $comment = qq(<br/>Test<br/>[url=#|onclick="printcoupon('3569')"]test comment[/url]);
$comment  =  HTML::Entities::encode_entities( $comment);