2009-03-06 12 views
1

これは私が人が来たページを印刷して特定のページにダミータグを置くことができるように設定しています。いくつかのページは、それらの間にテキストを含む "linkto"タグをコメントアウトしています。基本if/then with PHP

私の問題は、私のページの中には「linkto」というテキストがないことがあります。そこからこのページにリンクすると、「タイトル」と「/タイトル」の間にあるすべてのものを取りたいと思っています。それが空になったらタイトルをつかむように、私はどのようにeregiを変更できますか?

これまで私がこれまで持っていたことは、私はちょっとしたことが必要だと知っていますが、私はランク初心者です。任意の助けを事前にありがとう:

<?php 

$filesource = $_SERVER['HTTP_REFERER']; 
$a = fopen($filesource,"r"); //fopen("html_file.html","r"); 
$string = fread($a,1024); 
?> 
<?php 
if (eregi("<linkto>(.*)</linkto>", 
$string, $out)) { 
$outdata = $out[1]; 
} 
//echo $outdata; 
$outdatapart = explode(" " , $outdata); 

echo $part[0]; 

>ここ

+0

'$ _SERVER [" HTTP_REFERER "]'は空ではない変数ではないと仮定してください。これは信頼できない変数です。これは、ブラウザと人々が何も含まないようにこのオプションを設定できるからです。 – random

+0

...プロキシもそうです。 – alex

答えて

3

は、あなたが行く:?eregi()が一致しなかった場合、$ OUTDATA割り当てはブロックが実行されないかのように決して起こらないだろう。一致するものの、タグの間に何もない場合、$ outdataには空文字列が割り当てられます。どちらの場合も、!$ outdataがtrueになるので、代わりにtitleタグの2番目の一致にフォールバックすることができます。

また、一致の(。*)を(。*?)に変更しました。つまり、貪欲ではありません。あなたは

<title>Page Title</title> ... 
    ... <iframe><title>A second title tag!</title></iframe> 

に設定$文字列を持っていた場合、それは限り、テキストが間にあるように、可能な限り一致させようとしているため(。*)形式では、正規表現は

Page Title</title> ... ... <iframe><title>A second title tag! 

にマッチします任意の他の! (。*?)形式では、あなたが期待していたものと一致します。一致します。

Page Title 

できるだけ早く停止します。

...余談として

は、この事は興味深い仕組みですが、なぜあなたはそれが必要なのでしょうか?ページが他のページにリンクし、クエリ文字列を経由してパラメータを渡すことができます。

<a href="somescript.php?prevpage=Foo">...</a> 

その後somescript.phpが$ _GET [「prevpage」]スーパーグローバル変数を経由してprevpageパラメータにアクセスすることができます。

あなたの問題を解決できますか?

+0

私はそれがそこに渡されている他のものと競合すると心配していたので、私はすべてのリンクを変更したくないです。助けてくれてありがとう、みんな。私はどのようにするかを知っていましたが、 "テキストが一致していなければ彼の説明があります"と言う方法を知らなかった。 –

0

if、else。

if(eregi(...)) 
{ 
    . 
    . 
    . 
} 
else 
{ 
    just grab title; 
} 

おそらく、この非常に単純な答えを見つけるためにすばやくGoogle検索を実行しているはずです。あなたは$outdataに試合を割り当てる前に、ちょうど別のifテストを追加

+0

うわー、彼は「私はそれが何らかのif文であることを知っている」と言っていました...... ......私はサルがこれをグーグルで探せるかもしれないことに同意しますが、あなたはあまり気にしないでください。 – patricksweeney

+0

ええ、どこで猿を見つけるつもりですか?私は "if"を行う方法を知っていましたが、 "これと一致するテキストはありません"と言うだけではわかりませんでした。あなたの助けをありがとう、私はそれを感謝します。 –

0

if (eregi("<linkto>(.*)</linkto>", $string, $out)) { 
    if ($out[1] != "") { 
     $outdata = $out[1]; 
    } else { 
     // Look in the title. 
    } 
} 
1

POSIXの正規表現の拡張機能(EREGなど)はPHP 5.3.0で非推奨とされ、完全に消滅してしまうかもしれないPHP 6来ますPCRE関数(preg_matchやfriends)を使う方が良いでしょう。

PCRE関数も高速でバイナリで安全であり、非貪欲なマッチングなどのより多くの機能をサポートしています。

ちょうどポインタ。