【PHP】下らねぇ質問はID出して書き込みやがれ 112
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2011/10/31(月) 05:11:09.81ID:???過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 111
http://hibari.2ch.net/test/read.cgi/php/1317232566/
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0203nobodyさん
2011/11/07(月) 17:53:48.42ID:???入力フォームのチェックがややこしいならsqlite関係ないし、そうじゃないならなんのチェックするのか分からないし
0205nobodyさん
2011/11/07(月) 18:02:20.53ID:pflxypT1imgタグを許可したいのですが
$text = preg_replace("/<img ([a-zA-Z0-9;\-\s]+)>/","<img $1>",$text);
これで置換できないのはなぜでしょうか?
0206nobodyさん
2011/11/07(月) 18:03:33.50ID:pflxypT1imgタグを許可したいのですが
$text = preg_replace("/&lt;img ([a-zA-Z0-9;\-\s]+)&gt;/","<img $1>",$text);
これで置換できないのはなぜでしょうか?
0207nobodyさん
2011/11/07(月) 18:05:11.09ID:???0208nobodyさん
2011/11/07(月) 18:12:33.28ID:pflxypT1ありがとうございます
しかしながら
$text = preg_replace("/&lt;img ([a-zA-Z0-9:;\/\"\'\-\s]+)&gt;/","<img $1>",$text);
これでもダメでした
こういうときって()の中はどう書けばいいのかな
0210nobodyさん
2011/11/07(月) 18:22:15.38ID:???どうせならそれにあわせて、自動的にcreate tableをやってくれるものとかないかなと。
0211195
2011/11/07(月) 18:23:46.55ID:ViAJy6jaありがとうございます
言われた通り、コマンドラインから似たような配列で試してみたら以下になりました(上手く行ってます)
[root@localhost ~]# ary=("dog" "cat")
[root@localhost ~]# php -q /var/test.php ${ary}
string(3) "dog"
(↑ test.phpのecho var_dump($argv[1])の結果です)
同様に.php中のexec()で配列の引数を渡す時点で配列は
ary=("dog" "cat")の形にしなきゃダメなんでしょうか
ためしに
$params= '$("dog" "cat")';
exec("/usr/bin/php /var/test.php {$params}", $o, $r);
としてみましたが出力として何も表示されません
0213nobodyさん
2011/11/07(月) 18:39:24.63ID:???$text = preg_replace("/<img .+?>", "<img $1>", $text);
要素の中に>と<は絶対にこないはずなのでこれでいい
0215nobodyさん
2011/11/07(月) 18:43:43.10ID:???いやいやいや、PHPは文字列送るだけなんで配列なんてモンはコマンドラインに送れないっすよ。
"/usr/bin/php /var/test.php {$params}" はただの文字列で
{$params}は、 "Array" って変換されるだけの文字列なので、
"/usr/bin/php /var/test.php Array" なわけで・・・ ってだれか上で書いてたでしょう?
そこの部分を join使うなりしてスペースで区切った文字列にでもするしかないのでは。
0216199
2011/11/07(月) 18:45:51.49ID:???dbのテーブル作成、入力値チェック、取得
このようなことをできるだけ短いソースで記述できるライブラリはないでしょうか?
半コピヘなソースを大量に書くの大嫌い
0218195
2011/11/07(月) 18:52:12.08ID:ViAJy6jaあー、やっぱり文字列か数値しか引数に持てないんですか…
phpマニュアルのexec()の説明にそう書いてて欲しいよ
配列をシリアライズして引数にしたときにresponseに2が返ってきたのも
引数に使えない文字が出てきてたからかな
はぁー、どっと疲れる結果だ…
ありがとうございました
0219195
2011/11/07(月) 18:54:14.64ID:ViAJy6ja218を書いた直後にいま思いついたんですが
serializeしたものにaddslashes()したら渡せるでしょうか?
試してみます
0222215
2011/11/07(月) 19:01:32.88ID:???シリアライズしたパラメータをひとつ渡せってことね。
>>219
シェルに渡す文字列のパラメータの部分を 配列をシリアライズした文字列にして、 escapeshellarg通せばいいかと。
受け側のPHPで 元にもどすんだよ。
0223nobodyさん
2011/11/07(月) 19:23:11.80ID:pflxypT1ありがとうございます
しかしながら&がうまくいきません
$text = "&";
$text = preg_replace("/([a-zA-Z0-9:;.=\&\"\'\/\-\s]+)>/","hoge",$text);
echo $text;
出力結果:& ←なぜhogeにならない?
0224nobodyさん
2011/11/07(月) 19:26:27.71ID:pflxypT1変な>が入ってました
しかしこれでいいのかなぁ
0225nobodyさん
2011/11/07(月) 19:26:39.80ID:ciMO8Qf+$b = '/a/b/t/f/';
という二つのパスがあり、$bのパスを基準に$aへの相対パスを求める方法を教えてください
この組み合わせ例なら結果としては../../c/dを得たいのです
0228215
2011/11/07(月) 19:50:03.36ID:NMeIBL32後ろにいらない > がついてる
0229nobodyさん
2011/11/07(月) 20:17:49.33ID:???どっと疲れたのはあなたのやり方が拙いためなので、ここで言われても。
何を実行しようとしているのか確かめればいい。ちなみに、execで使用されるシェルおよび環境変数についても調べておいたほうがいいよ。
0230215
2011/11/07(月) 20:39:58.70ID:NMeIBL32$a = '/a/b/c/d/';
$b = '/a/b/t/f/';
print getrPath($b,$a);
function getrPath( $base , $target) {
$base = explode("/",$base);
$target = explode("/",$target);
$ret = array();
for($i=0;$i<count($base)-1;$i++)
if($base[$i]!=$target[$i])$ret[]="..";
for($i=count($base)-1-count($ret);$i<count($target);$i++)
$ret[]=$target[$i];
return implode("/",$ret);
}
行稼ぎで気持ち悪いのは勘弁な。
0232nobodyさん
2011/11/07(月) 20:58:54.70ID:???配列をimplode(" " , $hoge); ってして、スペース区切りでtest.php に渡したら?
test.php内で、foreach( $argv as $hoge )ってしたら、解決じゃね?w
0233nobodyさん
2011/11/07(月) 21:00:38.53ID:???空白はいるなら、””で囲むやらaddslashesやらしないとね
0234nobodyさん
2011/11/07(月) 21:23:15.59ID:???おもいつきで作るもんじゃねーな。訂正。
function getrPath( $base , $target) {
$base = explode("/",$base);
$target = explode("/",$target);
$ret = array();
$flg=false;
for($i=0;$i<count($base)-1;$i++)
if($base[$i]!=$target[$i]||$flg){$ret[]="..";$flg=true;}
for($i=count($base)-1-count($ret);$i<count($target);$i++)
$ret[]=$target[$i];
return implode("/",$ret);
}
0236nobodyさん
2011/11/07(月) 21:50:10.70ID:kLp4+73LPHP5.3.8にてDOMDocumentにてHTMLファイルを取得し、<body>内のテキストだけを抽出したいです。
タグ部は正規表現で除去出来ますが、問題になるのは<script>でJavaScriptの中身が表示される、<!--などのコメントが表示される事です。
で、<script>とコメントを含む部分を先に除去したいと思います。
/<script[^>]*?>.*?</script>/si
とかやってみたのですが良く分かりません。
アドバイスまたは似たような事を書かれているサイトなどを教えて頂けないでしょうか?
すると、正規表現使わずに出きるので、PHPスレにて聞けといわれました
どのようにすればいいのでしょうか?
0239nobodyさん
2011/11/07(月) 22:02:24.67ID:???ん? http://jp.php.net/manual/ja/book.dom.php の
一番上のコメントのやり方でも、無理ってこと?
ちょうどbodyって例だw
0240nobodyさん
2011/11/07(月) 22:20:23.00ID:???$doc->loadHtmlFile("hoge.php");
$element = $doc->getElementsByTagName("script");
$element->item(0)->parentNode->removeChild($element->item(0));
print $doc->saveHtml();
除去ならこっちじゃねーの?
0241nobodyさん
2011/11/07(月) 22:44:18.22ID:???$doc = new DOMDocument();
$doc->loadHTML(file_get_contents('http://www.nicovideo.jp/'));
$xpathObj = new DOMXPath($doc);
$textNodes = $xpathObj->evaluate('//body//*[name(.)!="script"][normalize-space(child::text()) != ""]/text()');
foreach ($textNodes as $key => $textNode) {
var_dump($textNode->wholeText);
}
0242nobodyさん
2011/11/07(月) 22:48:31.16ID:???C++の場合は、メソッドをstaticにするとプログラムがメモリに乗るから早くなるって聞いたことがあるんですが、
phpの場合はどうなんでしょうか?
みなさんは、phpでメソッドをstaticにする、しないをどのようにきりわけているでしょうか?
0243nobodyさん
2011/11/07(月) 23:01:03.48ID:???>>241
>除去っていうよりスクリプトタグ省いたTextが欲しいって事じゃないの?
そうです
テキスト部のみが欲しいのですが、
pre_replace()とかでタグとかを除去するための正規表現を考えていました
>>242
メモリはどうか分かりませんが、確かPHPもstaticの方が早いはずですよ
いい加減な事は言えませんが、オライリー本か何かに書いてましたよ
インスタンスを作成しないぶんとかなんとか
自分は意識してstaticで出来ることはstaticにしています
0244nobodyさん
2011/11/08(火) 00:16:56.83ID:???じゃあもうちょっと気持ち悪いのを。
function getrPath( $base , $target) {
$base = explode("/", $base);
$target = explode("/", $target);
while (($b = array_shift($base)) === ($t = array_shift($target)) && !is_null($b));
return implode("/", array_merge(array_fill(0, count($base), '..'), array($t), $target));
}
0245nobodyさん
2011/11/08(火) 00:18:23.69ID:???staticにするという事はメモリを使うということだ
staticを唱えた数だけメモリを使うことを頭に入れて使えばいいんだよ
staticをつけないといけないほど速度を気にしないといけないことってそうそうない
オープンソースでもstaticなんてメジャーどころはみない
0246nobodyさん
2011/11/08(火) 00:20:44.84ID:???0247nobodyさん
2011/11/08(火) 00:21:34.86ID:???phpに限らないけどね
0248nobodyさん
2011/11/08(火) 00:22:37.80ID:???0249nobodyさん
2011/11/08(火) 00:26:14.40ID:???0250nobodyさん
2011/11/08(火) 00:31:16.84ID:???0251nobodyさん
2011/11/08(火) 00:45:22.59ID:???まぬあるのあの文面どうなのって思うわ
0252nobodyさん
2011/11/08(火) 02:21:04.05ID:???プログラム板で聞いたほうがいい
http://hibari.2ch.net/tech/
PHPはこまけーこと気にしないでいいような
オヴァカさん向け設計なので
ご覧のようにまともな回答は返ってきません
そういうメモリやらなんやらの基礎知識は
基本情報あたりに手を出して初めて知るのがPHPer
0253nobodyさん
2011/11/08(火) 02:27:58.13ID:???大抵の人は「ああー、あの文面ね」って理解できるぐらいメジャーな話なんだろうけど、分からないorz
0256nobodyさん
2011/11/08(火) 02:50:14.75ID:???0257nobodyさん
2011/11/08(火) 03:01:35.87ID:???Prepared statementsを先ほど知ったのですが、
これって、毎回決まったようなクエリだったら
PDO::queryの変わりにPDO::prepareで実行すると
2回目から早いよって認識で大丈夫ですか?
ちょっと認識ずれてます?
0258257
2011/11/08(火) 03:02:31.41ID:6HzOoKMdID出し忘れのため、最投稿
0259nobodyさん
2011/11/08(火) 03:17:02.17ID:???だいたいそんな感じでいいよ
パラメータだけ変えて複数実行する時に有用
insert文やupdate文でまとめて複数行うときなんかによく使う
0260nobodyさん
2011/11/08(火) 09:21:39.20ID:hZ5KEzHU関数Aの中でまとまった処理がしたくて、
function A(){
function 纏まった処理(){};
纏まった処理();
纏まった処理();
}
としているのですが、この書き方でA()を実行すると纏まった処理()が
A()の中だけでなくグローバルになってしまいます。
A()の中だけで有効な関数の作り方はどうすればよいのでしょうか。
function A(){
$纏まった処理=function (){};
$纏まった処理();
$纏まった処理();
}
しか無いのでしょうか。
0261nobodyさん
2011/11/08(火) 09:30:32.81ID:???0262nobodyさん
2011/11/08(火) 09:33:12.26ID:???その関数内でしか使われない関数って定義はできないし、
ラムダ関数みたいな機能もないので
クラスで書いてもいい処理ならprivateで外からアクセスさせないようにするってくらいかな
0263257
2011/11/08(火) 09:35:34.95ID:6HzOoKMdなるほど、ちょっと試してみます。
ありがとうございます
0264nobodyさん
2011/11/08(火) 09:39:28.14ID:???記述が見易くならない可能性の方が高いんで、使えるかは微妙だけど
0266nobodyさん
2011/11/08(火) 09:56:54.62ID:???0267nobodyさん
2011/11/08(火) 10:30:09.32ID:Olz6L6I6class Test {
private $con;
private $hoge;
public function Test($hoge) {
$this->con = DB::get()->connect();
$this->hoge = $hoge;
}
public function a() {
$this->con->query("sql");
//$this->hogeを使う
}
public static function b() {
$con = DB::get()->connect();
$con->query("sql");
}
}
ポイントは
b()はインスタンス変数を必要としないのでstaticとしても呼び出せるようにしたい
$this->conが使えないのでstaticメソッドは毎回DB::get()->connect();をコールしないといけない
こういうのっておかしいですか?
0268nobodyさん
2011/11/08(火) 13:03:03.23ID:???ActiveRecordみたいなパターンがあるのでおかしくはない
そもそもそのTestが何を表してるのかが大事
クラスは箱や入れ物じゃないからな、型だぞ
$user = new User();
$user->name = 'hoge';
$user->save();
$user = User::findByName('hoge');
0269nobodyさん
2011/11/08(火) 14:36:04.18ID:lQaQJdzPclass内の先頭部でprivate $_dbなどメンバ変数(クラスのプロパティ)を定義しますが、
これと、メンバ関数function()内での変数$popとの違いは、
・$_dbはクラス全体で使える(あるメソッド内で値を代入されたらそれが他のメソッドでもその値が使用される)
・$popはその関数の中でのみ有効
という理解で宜しいのでしょうか?
0270nobodyさん
2011/11/08(火) 14:45:16.78ID:???スコープもわからんとは不思議なやつめ
staticを考慮しなければそういう理解でよろしいです
0271nobodyさん
2011/11/08(火) 16:16:16.06ID:???いい方法ないだろうか?
0273nobodyさん
2011/11/08(火) 16:23:44.63ID:92k+xz2Urequireは出来るのですが
file_get_contentsは403が返ってきてアクセスできません。
上記条件下でlocalhost内のファイルを文字列に読み込むにはどうしたらいいでしょうか?
0274nobodyさん
2011/11/08(火) 16:26:49.92ID:???requireしたファイルから文字を返すように書き直す
file_get_contentsで403が返るのは理由はHTTPの勉強をすれば出来ない理由が分かる
0275nobodyさん
2011/11/08(火) 16:30:50.05ID:???0276nobodyさん
2011/11/08(火) 16:40:15.24ID:???ttp://www.php.net/manual/ja/reflectionclass.getproperties.php
ここらあたりで出来たはず
>>273
file_get_contentsはファイルパスも受け付けるのでファイルパスを記述すりゃいい
file_get_contents('../../../hogehoge')
file_get_contents('/var/www/etc/hogehoge')
みたいな感じで
0277273
2011/11/08(火) 16:46:18.38ID:92k+xz2UURL形式ではなく>>276さんのおっしゃる方法でうまくいきました。
お三方ありがとうございました。
0278271
2011/11/08(火) 17:10:24.27ID:???どうやら、そのリフレクションでは、
クラスのデフォルト値しかとれないようです
コンストラクタとかで値を再定義しても、そっちは取得できない。
で、調べてみたらクラスをforeachにかけると取れるのがわかったので、
今回はそっちを使うことにしました
0279nobodyさん
2011/11/08(火) 18:28:41.45ID:++VodBMCHTTP_USER_AGENTに対する正規表現はどのように書くのがベストだと思いますか?
0280nobodyさん
2011/11/08(火) 18:33:52.57ID:???偽装できちゃうんで、それが出来る限りでしょう。
期待した答えじゃないなら、それ書いてね。
0281nobodyさん
2011/11/08(火) 18:37:55.45ID:++VodBMCそう言われてみればそうですね。
HTTP_USER_AGENTを使う方法以外に、
例えばクッキーみたいなブラウザにはついてる機能の有無を確認して
ブラウザからのアクセスかどうかを判定することはできそうですか?
0282nobodyさん
2011/11/08(火) 18:42:37.21ID:???やりたいことは何でしょうか。
0283nobodyさん
2011/11/08(火) 18:42:50.35ID:???そういうのは現実的ではないと思うなぁ
0284nobodyさん
2011/11/08(火) 18:49:56.34ID:++VodBMCそれではクッキーが有効かどうかで判定してみることにします。
アクセス解析みたいなプログラムで不要・不正なアクセスを除外したいです。
ありがとうございました。
0285nobodyさん
2011/11/08(火) 18:50:05.65ID:???諦めてください
0286nobodyさん
2011/11/08(火) 18:51:53.54ID:++VodBMC0287nobodyさん
2011/11/08(火) 18:54:58.54ID:???0288nobodyさん
2011/11/08(火) 18:57:11.31ID:++VodBMC0290nobodyさん
2011/11/08(火) 19:04:38.69ID:???Webブラウザが行う事はWebブラウザでしかできない訳ではないから素人の子供だましだけどさ
0292nobodyさん
2011/11/08(火) 19:13:52.74ID:lDLMrbx7loader.php
<?php
function flush(){
require_once("test.php");
}
flush();
?>
test.php
<html>
<head>
<link rel="stylesheet" href="test.css" type="text/css">
<script src="test.js" type="text/javascript">
</head>
<body>
<?php echo "hello,world" ?>
</body>
</html>
上のような2ファイルを使い、loader.phpを実行してブラウザに表示させると、test.php内で呼び出しているcssとjavascriptが読み込まれません。
生のhttpレスポンスを見たところ、test.cssとtest.jsではcontent-typeが
Content-Type: text/html;
となっていたため、htmlとして読み込まれていたために動作していなかったと分かりました。
これらcssとjavascriptファイルを適当なcontent-typeで読み込ませるにはどうしたらいいでしょうか?
0293nobodyさん
2011/11/08(火) 19:24:39.52ID:???0294nobodyさん
2011/11/08(火) 19:26:25.57ID:???0296nobodyさん
2011/11/08(火) 20:02:56.28ID:???0297292
2011/11/08(火) 20:09:12.54ID:lDLMrbx7パスをあわせると普通に読み込めました・・・
>>295
自分で>>87のようなルーティングスクリプトを作っています。
あるurlにアクセスしたら条件にマッチするクラスを実行し、
そのクラスの中でtest.phpのようなテンプレートを呼び出す、という形にしているため
こういう感じになりました。
どう変なのか教えてもらえるとうれしいです。
0300292
2011/11/08(火) 21:01:23.04ID:lDLMrbx7結局それもパスを正しいものにしたところで直っていました・・・・
0301nobodyさん
2011/11/08(火) 23:00:38.35ID:lQaQJdzPconfigure: error: readline library not found
と出ます
しかし、yumでreadline-develは入れていますし、32bit版ではこれで上手くいっていました
rpm -ql readlineで
/lib64/libreadline.so.6
/lib64/libreadline.so.6.0
/usr/lib64/libhistory.so.6
/usr/lib64/libhistory.so.6.0
が出てきたので--with-readline=/usr/lib64とかしましたがダメでした
どのようにすればいいのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています