変数参照とハイパーテキストリンクのスクリプトについて

このQ&Aのポイント
  • test1.phpとtest2.phpは文字列をハイパーテキストリンクに変換するスクリプトです。
  • test1.phpは正常に動作しますが、test2.phpは動作しません。原因は、test2.phpで変数$replacementsを正しく参照できないためです。
  • test2.phpの目的を達するためには、変数$replacementsを正しく参照できるように、ereg_replace関数の変数の値が空ではないことを確認する必要があります。
回答を見る
  • ベストアンサー

変数参照

test1.phpは文字列をハイパーテキストリンクに変換するスクリプトです。 これはうまく動いています。 <?php //test1.php // start set message $msg = "testtesttesttest http://www.example.com testtesttesttest"; // end set message // start set generate URL link $patterns = '(https?:\/\/[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)'; $replacements = '<a href="\\1">\\1</a>'; $msg = ereg_replace($patterns, $replacements, $msg); // end set generate URL link // start set message echo $msg; // end set message ?> test2.phpは文字列をハイパーテキストリンクに変換して最後尾に付加するスクリプトです。 これは動きません。 $replacementsにセットされたはずの変数がうまく参照できないのです。 <?php //test2.php // start set message $msg = "testtesttesttest http://www.example.com testtesttesttest"; // end set message // start set generate URL link $patterns = '(https?:\/\/[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)'; $replacements = '<a href="\\1">\\1</a>'; $msg = ereg_replace($patterns, "", $msg); // end set generate URL link // start set message echo $msg . $replacements; // end set message ?> 質問 1 test1.phpが動いてtest2.phpが動かない理由はなんでしょうか? 2 test2.phpの目的を達するためにはどう書けばよいでしょうか?

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
noname#94983
noname#94983
回答No.1

1 test1.phpが動いてtest2.phpが動かない理由はなんでしょうか? test2.phpでは、$msgでパターンにマッチする部分を空の文字列に置き換えている。これでマッチ部分が消えるのは正しい。ただし、 echo $msg . $replacements; これは、単に「置換済みテキストの後に、置換用のパターンを出力する」というだけだ。$replacementsはパターンであって、ここに置換されたテキストが収められるわけではまったくない。ただ'<a href="\\1">\\1</a>'というテキストが書き出されるだけだろうと思う。したがって、置換されたテキストの後に、\1とリンクが表示されるだけだろう。 2 test2.phpの目的を達するためにはどう書けばよいでしょうか? 要するに、パターンにマッチしたテキストを取り出して、これを<a>タグにして最後尾に付け足す、ということだろうか。例えば、こんな感じのことか? <?php //test1.php // start set message $msg = "testtesttesttest ​http://www.example.com​ testtesttesttest"; // end set message // start set generate URL link $patterns = '(https?:\/\/[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)'; $result1 = ereg_replace($patterns,"", $msg); $result2 = array(); $find = ereg($patterns, $msg, $result2); // end set generate URL link // start set message echo $result1 . '<a href="' . $result2[0] . '">' . $result2[0] . '</a>'; // end set message ?>

mywatertan
質問者

お礼

ありがとうございます。 置換用のパターンなのですね。 よくわかりました。

関連するQ&A

  • PHPのセッション変数について

    ページの構成が代わり、A-B-Cと順番だったのをA-Cと変更しました。 AからCリンクにとぶように設定したのですが、リンクを変更していてもBのページに行ってしまいます。 このプログラムを作った人に聞きましたところ、 if{session("user_sbt") というセッション変数で、新しく作られた画面のところで何もセットしていなければ初めの画面(B)に戻るというプログラムが走っているそうです。作った人に直してもらえたら良いのですが、事情で日本にはいないので、わかる方教えてください。よろしくお願いします。 PHPファイルの上部には session_start(); require_once("../_common/head.php"); require_once("../_common/mysql.php"); というセッション変数が記入されています。

    • 締切済み
    • PHP
  • タグに変数を埋め込んでも値が反映されません。

    こんにちわ。 最近PHPを始めた者です。 echo を使ってブラウザに出力する時に、 echo "<a href=test.php?     page=$page>$name</a>"; と記述しましたら、 ブラウザで 「$name」はリンクとして表示されますが、 リンクアドレスは、「test.php?page=」となり $pageの値が入りません。 解決方法を教えて欲しいです・・・。 初歩的なことかもしれませんが宜しくお願いします。

    • ベストアンサー
    • PHP
  • 移動元のURLを変数に取りたい

    例えば、 http://www.hoge.jp/foo.html に、 <a href="hoge.php"></a> というリンクが張られているとして、このリンクをクリックしてhoge.phpに移動したときに、移動元のURLアドレス「http://www.hoge.jp/foo.html」を変数に取りたいのですが、方法をご存知の方、教えてください。 (PHP4です)

    • ベストアンサー
    • PHP
  • smarty3で変数表示について

    smarty3 でエラーが発生しています。 現在自宅のサーバーでsmarty3を勉強しているのですが以下のエラーで困っています。 詳しい方ご教授お願いします。 環境 : CentOS 6.3 PHP 5.3.3 Smarty 3.1.13 読み込んでいるファイル test.php 1 <?php 2 ini_set('display_errors', 1); 3 ini_set('date.timezone','Asia/Tokyo'); 4 define('SMARTY_DIR', 'Smarty/libs/'); 5 require_once( SMARTY_DIR. 'Smarty.class.php'); 6 7 $smarty = new Smarty(); 8 9 $smarty->template_dir = '../templates/'; 10 $smarty->compile_dir = '../templates_c/'; 11 $smarty->config_dir = '../config/'; 12 $smarty->cache_dir = '../cache/'; 13 14 $msg = "テストを表示します"; 15 $smarty->assign('msg', $msg); 16 17 $smarty->display('test.tpl'); 18 19 20 ?> テンプレートファイル 1 <html> 2 {$msg} 3 </html> 表示されるエラー文 Fatal error: Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template "../templates/test.tpl" on line 2 "{$msg}" unknown tag "private_print_expression"' in /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php:665 Stack trace: #0 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php(451): Smarty_Internal_TemplateCompilerBase->trigger_template_error('unknown tag "pr...', 2) #1 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templateparser.php(2353): Smarty_Internal_TemplateCompilerBase->compileTag('private_print_e...', Array, Array) #2 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templateparser.php(3101): Smarty_Internal_Templateparser->yy_r27() #3 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templateparser.php(3201): Smarty_Internal_Templateparser->yy_reduce(27) #4 /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_intern in /usr/local/lib/php/includes/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 665 テンプレートファイルの{$msg}を削除して動作させるとコンパイルされてはいるようです。 よろしくお願いします。

    • 締切済み
    • PHP
  • セッション変数の受け渡しができない

    a.php: <?php session_start(); $_SESSION['test'] = "ok"; echo "<html><body>\n"; echo "<pre>\n"; var_dump($_SESSION); echo "</pre>\n"; echo "<a href=\"./b.php\">結果ページへ</a>"; echo "</body></html>\n"; ?> b.php: <?php session_start(); echo "<html><body>\n"; echo "<pre>\n"; var_dump($_SESSION); echo "</pre>\n"; echo "</body></html>\n"; ?> a.php の表示: array(1) { ["test"]=> string(2) "ok" } 結果ページへ b.php の表示: array(0) { } 再読込みでも同様です。 php.ini の Session 関係の項目は書籍やウェブサイトを参考にしておかしなものはないと自己判断していますが、指摘されるものを掲載します。

    • 締切済み
    • PHP
  • html構文をPHPの変数に正しく格納できない

    最近PHPを勉強していまして、変数の格納について、質問させていただきます。 <a href="aaa.index" onclick="window.open('bbb.php?id=ccc&adwares=ddd&url='); return false; rel='nofollow'"><img src="eee.jpg"></a> これは、とあるアフィリエイトプログラムの広告で、リンク先のページにリンクする時に、自分のidを送るというような構文(?)なのですが、 上の様な画像付リンク(アフィリエイトコード)をphpの変数に格納する場合、 <? php $url ='<a href="aaa.index" onclick="window.open(\'bbb.php?id=ccc&adwares=ddd&url=\'); return false; rel=\'nofollow\'"><img src="eee.jpg"></a>'; ?> として、 <?php echo $url ?> としましたが、新しいウインドウが出ずに、自分のサイトからのアクセスとして、 カウントされていませんでした。 どうすれば新しいウィンドウがでて、自分のサイトからのアクセスとして 認証されるでしょうか? それともそういう事は無理なのか?教えてください。

    • ベストアンサー
    • PHP
  • ASPクライアント側処理時の変数使用

    ASPアプリケーションにて、登録情報の入力チェックを行うため、下記のようにしたところ、メッセージボックスが出てきません(テキストボックスに入力される初期値はnullになっています)。クライアント側で処理させるため、メッセージボックスを使用しています。内部変数を使用しても上手くできないため、外部変数を使用してみました。 <% Set ObjConn = Server.CreateObject("ADODB.Connection") ObjConn.Open "database","","" Set ObjRS = Server.CreateObject("ADODB.Recordset") ObjRS.Open "master", ObjConn, 3, 3 Session.Contents.Item("test") = ObjRS.Fields("摂取量").Value %> <script language="VBScript"> <!-- msg = Session.Contents.Item("test") MsgBox "Null" & IsNull(msg) MsgBox "Empty" & IsEmpty(msg) MsgBox msg --> </script> <% ObjRS.Close ObjConn.Close %>

  • VBAで文字の位置が正確に取得できない

    Excel2003のマクロで、URLを抜き出すマクロを作っているのですが、なぜかurl_endの値が正確に取得できません。何がいけないのでしょうか? 事象 url_endに格納される値がなぜか1376(くらいだったような・・)になってしまう。 url_startには1260が格納されており、<a href=の部分をきちんと取得している。 ソース Sub test() Dim objIE As Object Dim objTAG As Object Dim souce As String Dim url As String Dim url_start As String Dim url_end As String url_end = 1 Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = False objIE.Navigate "http://dir.yahoo.co.jp/" Do While objIE.Busy = True DoEvents Loop Application.Wait Time:=Now + TimeValue("00:00:02") url_start = InStr(url_end, objIE.Document.All(1).Innerhtml,"<a href=", vbTextCompare) url_end = InStr(url_start,objIE.Document.All(1).Innerhtml, ">", vbTextCompare) url = Mid(objIE.Document.All(1).Innerhtml, url_start, url_end) Cells(1, 1).Value = url End Sub

  • セッションの変数の受渡しについて

    よろしくお願いします。 セッションを利用して変数受渡しを行おうと思い、初めての試み なので簡単なものを作ってやってみたのですが、変数に値をセットしたtest.phpでは値が表示されますが、リンク先のtest2.phpでは表示されません。 以下のソースで試しています。 -------------------------------------------------- test.php <?php session_start(); session_register("aa"); $_SESSION['aa'] = 1234; print $_SESSION['aa']; print "<p>"; print "<a href='test2.php'>next</a>";←ここの画面では表示されます。 ?> test2.php <?php session_start(); print $_SESSION['aa'];←表示されません ?> ---------------------------------------------- 想定では画面に”1234”と出ると思っていたんですが・・。 他質問をみて真似て色々試したのですが、やはり表示できませんでした。 環境は以下です apache2 php ver4.4.4 session Session Support enabled Registered save handlers files user Directive Local Value Master Value session.auto_start Off Off session.bug_compat_42 On On session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 100 100 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path c:\windows\Temp c:\windows\Temp session.serialize_handler php php session.use_cookies Off Off session.use_only_cookies On On session.use_trans_sid On On 環境の問題でしょうか?各ブラウザで試したのですが、ダメでした。 初歩的質問で申し訳ありませんが、ご教示よろしくお願いします。

    • ベストアンサー
    • PHP
  • 実体参照に置き換える方法について

    下記のソースをブラウザで閲覧した所、真っ白な画面が表示されてしまいました。 「'テスト"」の「'」を消した所、ブラウザに「テスト"」とリンクつきで表示されましたが、「'テスト"」と表示する方法が分かりませんでした。 なお、$testに入れている中身はデータベースから取得しており、ここの文言を直接触る事は出来ません。 データベースの中身の'を実体参照に置き換えた上で、$testに格納できれば大丈夫かと思ったのですが、どうすれば出来るかわからなかったため、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>title</title> </head> <body> <?php $test = '<a href="http://hoge.com/">'テスト"</a>'; $url = 'http://hoge.com/'; echo str_replace($url, '/', $test); ?> </body> </html> 以上、よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう