2017-10-31 20 views
0

私はこれらの2つの変数を比較しようとしています。彼らの両方が同じ値を持っている、しかし、1はhrefの変数である - 意味、それは次のように読んだ本href perl変数を通常のスカラ変数に変換する

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

などのファイルから読み込まれていますが、そうする場合、ブラウザでのアンカータグとして表示I私は

変数などのブラウザでご覧くださいprint "$collect_zids{$key} --> $temp";を使用して値を比較するために行く - >Variable

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

私が想定していますSEこのコードは

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

を実行していない理由を二つの値が故に異なっていることは、私はそれらを比較できるように、私は通常のスカラー変数へのhref変数を変換することができます方法はありますか?

ありがとうございます!

P.S.私はJavascriptが唯一の方法かもしれないと思っていますが、私はそれを経験していません。

+0

あなたは、1つの値 '「http://google.comを」'持ち、1が値 '」http://google.com'を持っている意味ですか - それらがあるので** **同じではありません!あなたは ''要素のテキストコンテンツを抽出できるようにPerlでHTMLを解析する方法を尋ねていますか? – Quentin

+0

同じ値で、私は意味します。例は1つのスカラー変数です。 "$ var =" Foo Bar ";そしてもう一つは' $ var2 = Foo Bar 'なので、' print "$ var - $ var2" 'を使って両方をブラウザに表示すると、 'Foo Bar - Foo Bar'ですが、唯一の問題はテキスト値とアンカーなので、' if($ var eq $ var2){print "hi"} 'を使って比較すると、それは後退しませんn本当です。 – user3302134

+3

両方ともテキスト値です。 1つはちょうどより多くのテキストがそれにある。 HTMLパーザーライブラリを見つけて、それを他の値と比較しようとする前にHTMLから気にするテキストの部分を抽出することができます。 – Quentin

答えて

2

"href変数"のようなものはありません。スカラー変数は2つあります。 1つはプレーンテキストを含み、もう1つはHTMLを含む。あなたの仕事は、HTML <a>タグ内のテキストをHTML変数から抽出し、そのテキストをプレーンテキスト変数のテキストと比較することです。

これを行う1つの方法は、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]"; 
} 

それは、これはどのように私は、文字列からHTMLを削除するにはPerl FAQ

に答えていることを指摘も価値がありますか?

使用HTML ::ストリップ、またはHTML :: FormatText HTMLが削除されますが は、得られるプレーンテキスト の少し簡単な書式設定を行うにしようとしないだけ。

アップデート:コメントで、私は明示的に変数を定義しておりませんので、私はこれらのメソッドを使用する方法がありません

を言います。

これは明らかに真実ではありません。どのように変数を初期化するかは、どのようにそれを使うことができるかには何の影響もありません。

私はあなたがこのようなコードでHTMLを取り除くでしょうので、あなたのHTMLのテキストは、変数$from_pictureであると仮定します。

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

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

私はあなたが私のソリューションを使用することができませんでしたアイデアを得た見当がつかないファイルからデータを読み込んでいた変数を直接初期化していたからです。プログラミングの重要なスキルは、複雑な状況を見て、関連する詳細を抽出する能力です。あなたが、私は生の文字列を取得することができた私はHTML::FormatTextモジュールを使用した後の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. 

を使用して答えを見つけることが

+0

アンカータグを同じブロック内に定義していない場合は、if条件を実行しています。アンカータグは、質問に記載されているようにファイルから読み取られています。これはcgiスクリプトであるため、ファイルから 'Variable'を指定すると、変数のみが出力されます。変数を明示的に定義していないため、これらのメソッドを使用する方法がありません。しかし、私はあなたの助けに感謝します。 Perl FAQが正しい方向に私を送ったので、ありがとう! – user3302134

+0

@ user3302134:*同じブロック内にアンカータグを定義していませんif if条件を実行しています* - あなたのことを言っていませんでした。私はちょうどそれが何が起こっていたかを簡単に説明できるようにしました。 *アンカータグは、質問に記載されているようにファイルから読み込まれています。 - 私はそれを認識しています。あなたはそれを非常に明確にしました。しかし、それは私の答えに影響を与えません。 *私は変数を明示的に定義していないので、これらのメソッドを使用する方法はありません。* - そうではありません。 –

+0

私はあなたの最初の方法を試してみましたが、それは私のためには機能しませんでした。しかし、私は 'HTML :: Strip'モジュールを試していませんでした。私はプライベートサーバを使用していないので、モジュールはインストールされていません。しかし、私は 'HTML :: FormatText'にアクセスして、そのメソッドを使って答えを書いたので、2番目のメソッドがうまくいくと確信しています。 – user3302134

0

:-)このエリアにいくつかのより多くの作業を行う必要があります表示されますHTMLとして解釈されるのではなく、読み込まれていました。だから、Variableの代わりに<a href=http://google.com>Variable</a>が返されました。生の文字列を取得した後、私は必要な部分を抽出する正規表現を使用することができます。

クレジットに - 「同じ値」とは、https://metacpan.org/pod/HTML::FormatText

+1

*読み込まれた生の文字列をHTMLとして解釈する代わりに取得できました。 "何かがHTMLとして解釈されている場合HTMLマークアップを含むテキストがあります。そのマークアップを削除する必要があります:これはHTML :: FormatTextがあなたのためにやっていることです(HTML :: Stripは正確に同じこと)。 –

関連する問題