【问题标题】:Converting href perl variables to normal scalar variables将 href perl 变量转换为普通标量变量
【发布时间】:2018-04-12 10:53:12
【问题描述】:

我想比较这两个变量。它们都有相同的值,但是,一个是 href 变量 - 意思是,它是从这样的文件中读取的

<a href=http://google.com>Variable</a>

它是这样读取的,但在浏览器中显示为锚标记,所以当我使用print "$collect_zids{$key} --&gt; $temp";比较一个值时,我在浏览器中看到的是

变量 --> Variable

How it appears in the browser. One text another link.

我假设这两个值是不同的,因此为什么这段代码没有运行

if($collect_zids{$key} eq $from_picture){
    print "<h1>Hello</h1>";
}

有没有办法可以将 href 变量转换为普通的标量变量,以便比较它们?

谢谢!

附:我认为 Javascript 可能是唯一的方法,但是,我没有任何经验。

【问题讨论】:

  • “相同的值”是指一个具有"http://google.com" 的值和一个具有"&lt;a href=http://google.com&gt;http://google.com&lt;/a&gt; 的值 - 因为它们相同!您是在问如何在 Perl 中解析 HTML,以便提取 &lt;a&gt; 元素的文本内容?
  • 我的意思是相同的值,例如 - 一个是标量变量,其值为“Foo Bar”。 $var = "Foo Bar";,另一个是$var2 = &lt;a href=http://google.com&gt;Foo Bar&lt;/a&gt;。所以,如果我要在浏览器中使用print "$var - $var2" 打印这两个,我会得到Foo Bar - Foo Bar。但唯一的问题是,一个是文本值,另一个是锚点。因此,当我使用if($var eq $var2){print "hi"} 比较它们时,它不会返回 true。
  • 两者都是文本值。一个只是有更多的文字。去寻找一个 HTML 解析器库,这样您就可以在尝试将其与其他值进行比较之前从 HTML 中提取您关心的文本。
  • 我在问题中添加了一张图片以显示它的外观。

标签: javascript html perl cgi


【解决方案1】:

没有“href 变量”这样的东西。你有两个标量变量。一个包含纯文本,另一个包含 HTML。您的任务是从 HTML 变量中提取 HTML &lt;a&gt; 标记内的文本,并将该文本与纯文本变量中的文本进行比较。

一种方法是从 HTML 变量中删除 HTML。

my $html = '<a href=http://google.com>Variable</a>';
my $text = 'Variable';

$html =~ s/<.+?>//g;

if ($html eq $text) {
  say "Equal";
} else {
  say "Not Equal [$html/$text]";
}

但无论如何强调都不过分,使用正则表达式解析 HTML 是非常脆弱的,并且保证在许多情况下都无法正常工作。使用真正的 HTML 解析器要好得多。 HTML::Strip 就是为此而生的。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';
use HTML::Strip;

my $html = '<a href=http://google.com>Variable</a>';
my $text = 'Variable';

my $parser = HTML::Strip->new;
$html = $parser->parse($html);

if ($html eq $text) {
  say "Equal";
} else {
  say "Not Equal [$html/$text]";
}

还值得指出的是,Perl FAQ 已经回答了这个问题

如何从字符串中删除 HTML?

使用 HTML::Strip 或 HTML::FormatText 不仅可以删除 HTML,而且 还尝试对生成的纯文本进行一些简单的格式化 文本。

更新:在评论中,你说

我没有办法使用这些方法,因为我没有明确定义变量。

这显然不是真的。变量的初始化方式与您如何使用它没有任何关系。

我假设您的 HTML 文本位于变量 $from_picture 中,因此您可以使用如下代码剥离 HTML:

my $parser = HTML::Strip->new;
my $stripped = $parser->parse($from_picture);

if($collect_zids{$key} eq $stripped){
  print "<h1>Hello</h1>";
}

我不知道你从哪里得到不能使用我的解决方案的想法,因为我直接初始化变量,而你正在从文件中读取数据。编程中的一项重要技能是看穿复杂情况并提取相关细节的能力。看来你需要在这方面做更多的工作:-)

【讨论】:

  • 我没有在运行 if 条件的同一块内定义锚标记。如问题中所述,正在从文件中读取锚标记。因为它是一个cgi脚本,当&lt;a href=http://google.com&gt;Variable&lt;/a&gt;从文件中时,它只输出Variable。我没有办法使用这些方法,因为我没有明确定义变量。但是,我感谢您的帮助。 Perl 常见问题解答给了我正确的方向,所以谢谢你!
  • @user3302134:我没有在运行 if 条件的同一块内定义锚标记 - 我没有说你是。我只是这样做是为了更容易演示正在发生的事情。 如问题中所述,正在从文件中读取锚标记 - 我意识到这一点。你说得很清楚。但这对我的回答没有影响。 我无法使用这些方法,因为我没有明确定义变量 - 这不是真的。
  • 我尝试了您的第一种方法,但它对我不起作用。但是,我没有尝试使用 HTML::Strip 模块,因为我没有使用私有服务器,因此没有安装该模块。但是,我相信您的第二种方法有效,因为我可以访问 HTML::FormatText 我使用该方法并为它写了一个答案。
  • @user3302134:我的第一种方法有效。但是除非您向我们展示您是如何使用它的,否则我们无法告诉您您做错了什么:-)
【解决方案2】:

我使用 Perl 模块HTML::FormatText;找到了答案

use HTML::FormatText;
my $formatter = HTML::FormatText->new();
my $string = HTML::FormatText->format_file("path_to_the_file"); #$string variable to hold the result and the path must be for a file.

使用HTML::FormatText 模块后,我能够获取正在读取的原始字符串,而不是将其解释为 HTML。所以,我得到了&lt;a href=http://google.com&gt;Variable&lt;/a&gt; 的返回,而不仅仅是Variable。得到原始字符串后,我可以使用正则表达式来提取我需要的部分。

归功于 - https://metacpan.org/pod/HTML::FormatText

【讨论】:

  • *我能够获取正在读取的原始字符串,而不是将其解释为 HTML” - 这不是将任何内容“解释”为 HTML 的情况。您的文本包含 HTML标记。您需要删除该标记。这就是 HTML::FormatText 正在为您做的事情(HTML::Strip 也会做同样的事情)。
猜你喜欢
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 2018-09-12
  • 2013-04-25
  • 2018-09-14
  • 2020-01-24
相关资源
最近更新 更多