我正在使用 Html::Strip 模块从文件中删除所有 html 标签。然后我想操作生成的文本(去除 html),最后将 html 标签返回到它们的原始位置。
我正在做的文本操作需要使用 split(/ /, $text) 将文本分成数组。然后我对结果数组进行一些自然语言处理(包括向一些关键词添加新的html 标签)。处理完文本后,我想将原始标签返回到它们的位置,同时保持我在此期间完成的文本操作完好无损。
如果我可以简单地从原始标签中删除所有空白,我会很满意(因为浏览器会忽略标签中的空白)。这样,我的 NLProcessing 可以简单地忽略作为标签的单词(包含“<”或“>”)。
我已经尝试深入研究 Html::Strip 的内容(为了根据我的需要对其进行修改),但我无法理解以下代码的作用:
my $stripped = $self->strip_html( $text );
if( $self->decode_entities && $_html_entities_p ) {
$stripped = HTML::Entities::decode($stripped);
}
似乎 strip_html 是一个子,但我在任何地方都找不到那个子。
无论如何,感谢您的任何建议。
... 第二天...
在与@amon 反复讨论之后,我想出了一个我认为足以满足我的目的的解决方案。amon 把我推向了正确的方向,尽管他建议我不要做我已经做过的事情,哈哈。
这是一种野蛮的方法,但可以令人满意地完成工作。如果其他人有与我相同的愿望并且不介意快速而肮脏的解决方案,请将其留在这里:
my $input = text.html;
my $stripped = $hs->parse($input);
$hs->eof;
所以现在我有两个字符串变量。一个是我要操作的html文件,另一个是去掉了html的同一个文件。
my @marks = split(/\s/, $stripped);
@marks = uniq(@marks);
现在,我有一个出现在我的文件中的所有非 HTMLtag 相关单词的列表。
$input = HTML::Entities::decode($input);
$input =~ s/\</ \</g;
$input =~ s/\>/\> /g;
$input =~ s/\n/ \n /g;
$input =~ s/\r/ \r /g;
$input =~ s/\t/ \t /g;
现在我已经解码了包含 var 的 HTML,并确保没有单词与“<”或“>”或非空格空白字符相冲突。
foreach my $mark(@marks) { $input =~ s/ \Q$mark\E / TAQ\+$mark\TAQ /g; }
$input =~ s/TAQ\+TAQ//g;
现在我已经用“+”“标记”了每个单词,并使用 TAQ 分隔符将单词与非单词分开。我现在可以在 TAQ 上拆分并在执行 NLP 和文本操作时忽略任何不包含“+”的项目。完成后,我重新加入并删除所有“+”。然后用一些巧妙的编码,删除我插入的所有额外空格,然后BAM!我现在已经完成了我的 NLProcessing,操作了文本,并且我的所有 HTML 仍然在正确的位置。
这里有很多警告,我不打算全部讨论。最大的问题是需要先解码然后编码,再加上 HTML::Strip 并不总是剥离所有 javascript 或无效 HTML 的事实。有一些方法可以解决这个问题,但我再次没有空间或时间在这里讨论这个问题。
感谢 amon 的帮助,我欢迎任何批评或建议。我是新手。