質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

取得したURLに現在のドメイン名が含まれていたらtarget="_blank”しない

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,797

score 14

前提・実現したいこと

$_SERVER['HTTP_HOST']で現在のドメイン名を取得して、指定したドメイン名と同じ場合で分岐させたい。

該当のソースコード

<?php if ( $program[ 'url' ] == '') : ?>
<div>リンクテキスト</div>
<?php  elseif (strstr($_SERVER['HTTP_HOST'],'○○○○○○○○.com/')) : ?>
<div><a href="<?=$program[ 'url' ]?>">リンクテキスト</a></div>
<?php  else :?>
<div><a href="<?=$program[ 'url' ]?>" target="_blank">リンクテキスト</a></div>
<?php endif; ?>

修正後

<?php if ( $program[ 'url' ] == '') : ?>
<div>リンクテキスト</div>
<?php  elseif (preg_match($_SERVER['HTTP_HOST'],$program[ 'url' ])) : ?>
<div><a href="<?=$program[ 'url' ]?>">リンクテキスト</a></div>
<?php  else :?>
<div><a href="<?=$program[ 'url' ]?>" target="_blank">リンクテキスト</a></div>
<?php endif; ?>

試したこと

$_SERVER['HTTP_HOST']と$program[ 'url' ]に一致するURLがあれば、urlとリンクテキストを出力、一致しなければ target="_blank"が記載されたものが出力としたい。
上記の修正後コードでは、エラーはでていませんが、すべてにtarget="_blank"が付与されてしまいます。
→エラーでておりました。

<?php  elseif (preg_match($_SERVER['HTTP_HOST'],$day_program[ 'url' ])) : ?>


がエラーになっています。

補足情報(言語/FW/ツール等のバージョンなど)

javascript、php

javascript、phpともに初心者です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/10/20 14:23

    コードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。

    キャンセル

  • takesu

    2016/10/20 14:32

    失礼いたしました。コードを修正させていただきました。ご指摘ありがとうございます。

    キャンセル

  • kei344

    2016/10/20 15:36

    回答が付いた質問の編集は慎重に行ってください。質問文のコードについて指摘があった場合は「追記」し、元のコードを編集する場合も「直したこと」がわかるようにしてください。また、例示用ドメインはご自身で所有されていない限りexample.comを利用してください。

    キャンセル

  • Y.H.

    2016/10/20 16:01

    エラーが発生している場合はエラーメッセージをそのまま記載ください。でないと何もアドバイスできないです。

    キャンセル

回答 4

checkベストアンサー

+2

Anchorタグに指定するURLのリストはPHPで持ってる($program['url'])ので
Javascriptなど関係なく、PHPで以下のようにすればいいのでは?

<?php if ( $program[ 'url' ] == '') : ?>
<div>リンクテキスト</div>
が必要なのですが、こちらを加味すればコードはどう変化するでしょうか。ちょっと考えてみましたが、うまくできませんでした。

ベストアンサー付いた後になってしまいましたがこの件含めたコードに書き直しました。
以下でどうでしょうか?そのまま if/elseif/elseで分岐しているだけです。

いろいろ前提事項

  • var_dump($_SERVER["HTTP_HOST"]); などで表示してみるとわかると思いますが、ホスト名(FQDN)しか設定されてません。(最後に'/'などはいってません。)
  • preg_match()の第一引数には正規表現パターンを記載します。
  • $program['url'] には URL (例:'http://example.com/foo/bar/...')が設定されているのですよね?
<?php
$linkText = 'リンクテキスト';
if (empty($program['url'])) {
    $Tag = $linkText;
} else if (! preg_match('/^(https?):\/\/' . $_SERVER["HTTP_HOST"] . '\//', $program['url'])) {
    $Tag = '<a href="' . $program['url'] . '" target="_blank">' . $linkText . '</a>';
} else {
    $Tag = '<a href="' . $program['url'] . '">' .                 $linkText . '</a>';
}
?>
<div><?php echo $tag; ?></div>

テスト:
この場合、target='_blank' は出力されない。

<?php
$program =array();
$program['url'] = 'http://'. $_SERVER["HTTP_HOST"] . '/hoo/var/index.html?hogehoge';
$linkText = 'リンクテキスト';
if (empty($program['url'])) {
    $Tag = $linkText;
} else if (! preg_match('/^(https?):\/\/' . $_SERVER["HTTP_HOST"] . '\//', $program['url'])) {
    $Tag = '<a href="' . $program['url'] . '" target="_blank">' . $linkText . '</a>';
} else {
    $Tag = '<a href="' . $program['url'] . '">' .                 $linkText . '</a>';
}
?>
<div><?php echo $tag; ?></div>

この場合、target='_blank' は出力される。

<?php
$program =array();
$program['url'] = 'https://www.yahoo.co.jp/hoo/var/index.html?hogehoge';
$linkText = 'リンクテキスト';
if ($program[ 'url' ] == '') {
    $Tag = $linkText;
} else if (! preg_match('/^(https?):\/\/' . $_SERVER["HTTP_HOST"] . '\//', $program['url'])) {
    $Tag = '<a href="' . $program['url'] . '" target="_blank">' . $linkText . '</a>';
} else {
    $Tag = '<a href="' . $program['url'] . '">' .                 $linkText . '</a>';
}
?>
<div><?php echo $tag; ?></div>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/20 15:15

    $program['url']にはパスだけではなくて、ホスト配下が含まれてしまっているので、教えていただいたコードではできないようでした。でもとても勉強になりました!ありがとうございます。

    キャンセル

  • 2016/10/20 15:44

    本質的ではない箇所ですが、少しコードを変更しました。
    (<?= ?>形式はうちの環境では使えないので<?php echo $program[ 'url' ];?>に変更しています。)

    「ホスト配下が含まれてしまっているので」・・・なので完全一致ではなく preg_match()を使用し正規表現でマッチさせています。
    こちらでは上記で問題なく処理できています。

    キャンセル

  • 2016/10/20 16:16

    最初の分岐で
    <?php if ( $program[ 'url' ] == '') : ?>
    <div>リンクテキスト</div>
    が必要なのですが、こちらを加味すればコードはどう変化するでしょうか。ちょっと考えてみましたが、うまくできませんでした。

    キャンセル

+2

(Node.jsのようなサーバサイドは別として)ふつうのHTML中で使われるJavaScriptは、ブラウザ内で実行されます。一方で、PHPはサーバ側で実行されます。

ということで、ブラウザでJavaScriptを実行する頃には、PHPの実行は終わっています。「jsに処理を記載して、php内に呼び出したいです。」なんて芸当は一筋縄では行きません(し、ユーザーの入力をPHPにフィードバックさせるわけでもなければ無駄が多くなります)。

まずは「PHPで行う」か「JavaScriptで行う」かのどちらかに決めてください(ブラウザ側で変化させる必要が無いので、PHPでやったほうがいいと個人的には思います)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/20 15:12

    全然理解できていませんでした!ありがとうございます。

    キャンセル

0

// else if ($_SERVER['HTTP_HOST']=='https://指定したドメイン名/') :
// ↓
   elseif ($_SERVER['HTTP_HOST']=='https://指定したドメイン名/') :

【PHP: elseif/else if - Manual】
http://php.net/manual/ja/control-structures.elseif.php

コロンを使って if/elseif 条件を指定する場合は、 else if のように分割してはいけません。 分割すると、パースエラーとなってしまいます。 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/20 15:16

    まさかこんな落とし穴があったとは知りませんでした!ありがとうございます!

    キャンセル

0

こちらで解決できました。
みなさまご丁寧にありがとうございます。本当に助かりました。

<?php if ( $program[ 'url' ] == '') : ?>
<div>リンクテキスト</div>
<?php  elseif (strpos($program[ 'url' ],$_SERVER['HTTP_HOST'])=== FALSE) : ?>
<div><a href="<?=$program[ 'url' ]?>" target="_blank">リンクテキスト</a></div>
<?php  else :?>
<div><a href="<?=$program[ 'url' ]?>">リンクテキスト</a></div>
<?php endif; ?>


※local開発環境でチェックしていたため、本番のURLと差異が出てしまって、解決するのに時間がかかってしまいました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る