- 1 名前:デフォルトの名無しさん [2022/09/20(火) 16:46:23.39 ID:Sb2Kpzh+0.net]
- !extend::vvvvv:1000:512
!extend::vvvvv:1000:512 ★スレ立て時 ↑ が3行以上になるようコピペ PHPに関する質問スレです 前スレ 【PHP】下らねぇ質問はここに書き込みやがれ 13 https://mevius.5ch.net/test/read.cgi/tech/1631147923/ 次スレは>>980以降 VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
- 892 名前:デフォルトの名無しさん mailto:sage [2024/09/26(木) 20:33:58.69 ID:RCBNwTlp0.net]
- >>891
いやエスパーすべきは、 > var_dumpで > 要素数23ってなってるのに15しか表示されん の部分だと思うが。 そして俺がエスパーするなら、多分初心者用 『教材』 としてどこかの馬鹿が作った、 実用性皆無だが、PHPなりの型変換等で見た目奇妙な動作をする何かを与えられ、 動きを理解しなさい、或いはどうしてそうなるかを説明しなさい、みたいな 『練習問題』 をやらされてるのではないかと。 正直この手の 『クソ課題』 は無視でいいよ、他言語である程度組める実力があるのなら尚更。 array_mergeなんて普通に使ってる分には名前通りの直感的な仕様だし、ハマる所ではない。 PHPはクソだが、クソ糞言うのなら他言語使えばいい話であって、 PHP使うと決めた/決まっているのならクソであろうが使うしかないし、糞な所ばかり気にしてても始まらない。 そしてPHPが糞だと思うのはプログラミング言語と捉えるからであって、Web専用シェルと考えればすごく有用だと気づく。
- 893 名前:デフォルトの名無しさん mailto:sage [2024/09/26(木) 22:38:14.36 ID:y4Her8JE0.net]
- >892へ
>891の私がエスパーなりの解釈させてもらうw >できてるけどvar_dumpで表示されてないだけか? >要素数23ってなってるのに15しか表示されん 「できてるけど」=array_mergeは機能してるけど、 「var_dumpで表示されてないだけか?」=var_dumpして23あった要素が15に減ってるのは表示されてないだけか? 「要素数23ってなってるのに」=あ、ごめん主語無かったねぐへへへwつまり配列を直接var_dumpでデバッグした時は要素数23ってなってるのに 「15しか表示されん」=array_merge の結果をvar_dumpすると15しか表示されん 繋げると array_mergeは機能してるけど、var_dumpして23あった要素が15に減ってるのは表示されてないだけか?あ、ごめん主語無かったねぐへへへwつまり配列を直接var_dumpでデバッグした時は要素数23ってなってるのにarray_merge の結果をvar_dumpすると15しか表示されん いずれにしても>884-885のように話し言葉と書き言葉を一緒くたにしてしまう人や、脳みそと口または手が直結してしまって伝える内容を並び替えできない人とは本気で仕事したくないw
- 894 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 00:37:53.28 ID:793m8l+c0.net]
- こんなことに数分でも時間つかうのがもったいないw
- 895 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 01:03:15.09 ID:xb00usC10.net]
- そのコメント書くのに何分かかった?
- 896 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 10:54:14.55 ID:+POBWt7L0.net]
- エスパーしてる連中がキモすぎる
- 897 名前:デフォルトの名無しさん (ワッチョイ dee7-rNKn) mailto:sage [2024/09/27(金) 16:27:53.83 ID:wGbKsk4o0.net]
- $a = ["a"=>0, "b"=>1];
$b = ["b"=>1, "c"=>2]; $c = array_merge($a,$b); var_dump($c); 俺が>>885ならまず最初にこれを疑うかな
- 898 名前:デフォルトの名無しさん (ワッチョイ 6f68-2Kaa) mailto:sage [2024/10/03(木) 19:40:44.30 ID:/z7xIJX+0.net]
- netbeans使ってるんですが、こいつが出す警告(モジュールは20行以内にしろ、$_POST使うなとか、クラスは1ファイル1クラスにして名前を揃えろとか)には従っておくほうがいいんでしょうか?
$_POSTなんて入門サイトとか入門書だと未だに主流だし、今の相場がどんなものか知りたいです
- 899 名前:デフォルトの名無しさん mailto:sage [2024/10/03(木) 20:14:27.24 ID:+g5yChSt0.net]
- netbeansってのは使った事ないから分からないけど「$_POST使うな」は無茶だと思うけどね
あとモジュールも20行以上になる事なんか当たり前にあるよ 実際にソース貼って、その上でどんな警告出てるかも貼った方がより正確に回答出来る気がする コードの文脈を考えた時に必要無い処理である可能性もあって警告出してくれてるかもしれんからね(知らんけど)
- 900 名前:デフォルトの名無しさん mailto:sage [2024/10/03(木) 20:35:40.28 ID:SHWJQkyV0.net]
- この辺ではなかろうか
「スーパーグローバル$_POST配列に直接アクセスしないでください」
- 901 名前:902 mailto:sage [2024/10/03(木) 20:53:20.38 ID:/z7xIJX+0.net]
- >>899
>>900 実際のとこ、filterinputを使ったりモジュールは分割したりで回避できてるのですが、もしかしてこんなことやってるの俺だけ?って不安になったので
- 902 名前:デフォルトの名無しさん mailto:sage [2024/10/03(木) 20:59:42.10 ID:tAJvCxJt0.net]
- >>900
netbeans使ってるけどそれだぞ ちなみに表示は、以下 ================================ スーパーグローバル$_POST配列に直接アクセスしないでください。 かわりにフィルタリング関数(例: filter_input()、is_*()関数を使用した条件など)を使用してください。 ---- ([Alt]+[Enter]キーを押すとヒントが表示されます) ================================ >>898 分からないのなら従うのが常道(=自分で自信持って不要と判断出来ないのなら従え) 入門サイトとか入門書がゴミなだけ、マジで参考にするのは全部php,netとlaravelにしろ 掲示板なんて簡単ですよ!とか言いつつgetで書き込みとか、死ねな入門サイトはいくらでもある Qiitaの方がまだだいぶマシ、あいつらは自分でやった事を書いてるだけなので > モジュールは20行以内にしろ 普通に経験があれば自分で判断出来る、出来ないのなら従え > $_POST使うな 上記の通り、filter_input使え馬鹿、と出るはず > クラスは1ファイル1クラスにして Javaの文化で、つまり慣れの問題 > 名前を揃えろとか 意味不明(必要ないのではなく、何が言いたいのか分からんので判断付かない)
- 903 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 08:58:20.60 ID:/JNwl4gJ0.net]
- >902
俺は>899だが$_POSTに関して、配列に直接アクセスしてゴニョゴニョすんなよってことね、理解した >898 ちなみにfilter_inputをバリデーションとかサニタイズで使おうとすると期待してた動作通りに行かないこともままあるから気を付けてね。例としてhtmlタグ取り除きたい時とかは正規表現使って自分で関数作った方が良かったりする。いずれにしてもphpの組み込み関数使う時は必ずphpの公式リファレンス読むようにした方が良いよ
- 904 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 10:07:59.19 ID:5cV2iGMA0.net]
- >>903
> 例としてhtmlタグ取り除きたい時とかは正規表現使って自分で関数作った方が良かったりする。 気持ちは分かるが特定のタグを除去したいときは公式DOM使った方がよいかと 単純な末端ノードならいいが、階層作られたらだいたい無理なので なおボロカス言われてるDOMだが、俺はJSでもjQuery不要派なのでさほど不満はなかった
- 905 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 11:52:16.55 ID:/JNwl4gJ0.net]
- >904
フロント側でタグを取っちゃうって認識で合ってるかな?自分が基本バックエンドの人間なのでフロント殆ど触らんのよね…w でも提案有難う
- 906 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 12:00:04.09 ID:b7vgemF30.net]
- ちゃんとしたものを作ろうとすると、本格的ブラウザ作る並に大変笑
- 907 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 12:14:58.84 ID:M8Xyx2No0.net]
- phpの話なのにフロントでタグ取り除くとかバックエンドで正規表現使ってタグ取り除くとか意味わからん
フロントでやるならJSの仕事だしバックエンドのPHPなら自分でhtml組み立ててるんだから正規表現使ってhtmlタグを取り除く必要とかそもそもない
- 908 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 12:48:49.83 ID:5cV2iGMA0.net]
- >>905
htmlタグを取り除く=PHPでスクレイプ、或いは掲示板等で許可してないタグを投稿されたときに、PHPでタグを除去する場合を考えている PHPのDOMはゴミ扱いされてるが、ほぼ生JSと同じなので個人的には問題なかった 正規表現は階層/入れ子を考慮されてないので、正規表現でhtmlをパースするのは死ねるし変な物を食わされたらだいたいバグる とはいえDOM構築はそれなりに遅くなるので、スクレイプ先のhtml構造が単純かつ固定的なときは正規表現で除去するのもあり フロント側に不要タグ含めて垂れ流すのもありだが、DBやネットワークの帯域を無駄に消費するだけなので、 可能であれば上流=PHP側で除去した方がいいのは事実
- 909 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 13:33:27.23 ID:swUgCMz+0.net]
- filter_input使え って警告、PhpStormでは見たことないな
運良く推奨されるパターンでも踏んでるのかな
- 910 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 14:14:38.35 ID:5cV2iGMA0.net]
- >>909
IDE内部のリンターなので、直接関係ないのと、 あったとしても普通に切れる
- 911 名前:デフォルトの名無しさん (ワッチョイ 3f72-Ligk) mailto:sage [2024/10/04(金) 16:00:15.82 ID:M8Xyx2No0.net]
- >>908
PHPでスクレイプ時に特定のhtmlタグを取り除くってレアリティ高いな そっちはいいとしてユーザー入力に許可されてないタグがあるならエラー返した方がいいと思うが除去するにしてもstrip_tagsやHTMLPurifierみたいな出来上がったものを使った方がいいのでは? あとフロントでタグ除去するのはユーザーアクションに応じてhtmlを変更するためで不要タグを垂れ流してるわけではない
- 912 名前:デフォルトの名無しさん (ワッチョイ 037b-jS/a) mailto:sage [2024/10/04(金) 19:01:50.57 ID:5cV2iGMA0.net]
- >>911
> strip_tagsやHTMLPurifierみたいな出来上がったものを使った方がいいのでは? これらはいいね 言及出来なかったのは俺が単に知らなかったからで、タグ単位の除去にはこれらを使うべきだろう > レアリティ高いな そうでもないから上記の関数/ライブラリが整備されてるわけだ ただPHPはこの手の、あると便利だが的な関数が無駄に多く、把握しきれてなかったのは上記の通り > ユーザー入力に許可されてないタグがあるならエラー返した方がいいと思うが 相手がまともな人間の場合はそうだが、 攻撃目的で掲示板にタグを書き込んでくる場合、晒しの意味でも黙って落としてそのまま表示させるのもあり 瞬時にエラーを返してしまうと、何がどこまで駄目なのかすぐばれてしまう 何だかんだで無駄に時間をかけさせるのは地味に有効 > あとフロントでタグ除去するのはユーザーアクションに応じてhtmlを変更するためで不要タグを垂れ流してるわけではない それは俺に言わせれば、(使う可能性のあるタグなので)仕様上サーバー側では落とせない、となる サーバー側で落としておくべきなのは、どうやっても不要なタグ、具体的に言うとscriptとか、 或いは公式strip_tagsの警告に書かれてるとおり、onXXXX属性 ただstyle属性まで落とすと、タグを許可した意味が無くなってくるので、判断は難しいところ opacityとかだけは許可しない等、属性も精査する気だと、結局DOM使う事になるとは思うが…HTMLPurifierでも出来るらしい まあこの辺は要調査だな
- 913 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 19:47:14.07 ID:eshA0leg0.net]
- >907
どう言うこと?w PHPでデータベース扱ってる現場ならバックエンドにデータ飛んでくる前にタグ取り除くでしょ 俺の場合はPHPのユーザー定義関数で正規表現使ってタグ取り除く関数を作ったらhtmlのフォーム内でバリデーションとサニタイズ行なってるけど >自分でhtml組み立てるんだから 分業してる現場なのでJSはフロントの子がやってるのよ だからフロントは殆ど触らないし関数作ったらフロントの子に渡してる
- 914 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 19:48:47.53 ID:eshA0leg0.net]
- >913
× htmlのフォーム内でバリデーションとサニタイズ行なってるけど ⚪︎ htmlのフォーム内に適宜関数を挿してバリデーションとサニタイズ行なってるけど
- 915 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 20:30:24.85 ID:5cV2iGMA0.net]
- >>913
俺宛ではないが、>>907の使い方はまあ普通、というか9割以上の局面ではそうなる > バックエンドにデータ飛んでくる前にタグ取り除く そもそもDBへのアップデータでタグを許可してない/する必要ないのがほぼ全部 例えばここ5ch、安価は最終的に<a>として表示されるが、ユーザーの投稿段階ではただのテキスト それをDB登録段階で<a>にしてしまうか、JSで<a>にするかは実装によるが、PHPでタグ除去なんてする必要がない > PHPのユーザー定義関数で正規表現使ってタグ取り除く関数を作ったら > htmlのフォーム内に適宜関数を挿してバリデーションとサニタイズ行なってる > だからフロントは殆ど触らないし関数作ったらフロントの子に渡してる もしかしてEmscriptenかWebAssenbly使ってPHPのコードをクライアントサイドで動かしてる? それはすさまじくレアだと思うのだけども
- 916 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 21:11:39.79 ID:eshA0leg0.net]
- >915
>PHPでタグ除去なんてする必要がない これは自分の言葉足らずでしたわ。謝ります ユーザーからのhtmlタグの投稿を一切許可していない現場なのよ、だからタグはDB到達前に全部サニタイズしてる >もしかしてEmscriptenかWebAssenbly使ってPHPのコードをクライアントサイドで動かしてる? いや、素のPHP(Laravelとかのフレームワーク使わず)でコード書いてて、ライブラリ含めて全てフルスクラッチで作成してる現場だよ
- 917 名前:デフォルトの名無しさん mailto:sage [2024/10/16(水) 16:44:48.13 ID:tW0ztwU3d.net]
- 先生!PHP独学したいのですが
独習PHP 第4版 山田 祥寛 (著) これでいいですか? C# Java VBA JavaScript 経験者です
- 918 名前:デフォルトの名無しさん mailto:sage [2024/10/16(水) 22:44:42.10 ID:XSPkOsBG0.net]
- >>917
php.netを頭から全部読めばそれで十分 多分SQLも必須、というかPHPは自身の変数等を保持する機構が言語にないのでどうせDBを使うことになる
- 919 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 00:25:58.27 ID:exPg1AY+0.net]
- >>918
本物のワルなのでセッション使っちゃうぜ
- 920 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 00:33:42.25 ID:13fsix/Td.net]
- >>918
先生!ぼくおじさんなので本にカキカキメモしながらじゃないと勉強できません 後出しですがSQLも基本的なところはできます 独習PHP 第4版が古すぎるとかいうのでなければよいのですが
- 921 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 08:25:20.34 ID:aXgLojE+0.net]
- >>919
ユーザーまたげねえだろ というか普通のサーバーのように、全体の変数を保持する事が出来ない だから毎回初期値やデータを一からロードし直す必要があってウザかったが、 JSもクローム拡張V3では同様になってるから、サーバーとしては適切な構造なのだろうよ PHPの場合、これにより毎回最初から行うのを強制され、結果的に毎回同じ動作となり、デバッグしやすくなってるのも事実 糞言語だが、何だかんだで結果的によく出来てるから使い続けられてる でもやはりウザイのも事実で、Node他ならもうちょっとすっきり書けるのに、というのは多々ある ちょっとした配列を保持出来てれば済むのに、一々DBにtry-catchになるから >>920 持ってないから知らん
- 922 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 08:51:18.77 ID:Q0zeibWJ0.net]
- >>921
セッションIDを知っていればユーザーを跨げるので、本物のワルはこれを悪用しちゃうぜ
- 923 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 09:15:02.73 ID:aXgLojE+0.net]
- >>922
いやそれはアウトだろ ただ、「絶対に誰にも使われないセッションID」を作れれば便利な倉庫に出来るのかな? まあ俺はそこまでPHP知らんので止めとくが しかしPHPは色々糞ったれなことが多い 今目に付いてるのはアップロードされたファイルが $_FILES["pictures"]["tmp_name"][$index] に入る点 逆じゃボケ!!!$_FILES["pictures"][$index]["tmp_name"] に入れろや!!!ってね この辺一々糞コード化を余儀なくされてストレスが溜まる まあlaravel導入すれば解決するんだろうけどさ
- 924 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 23:09:44.41 ID:goFejqio0.net]
- >917
私見で恐縮だけど、それだけ他言語を学習済みなら(経験年数にもよるけど)基礎的な事は理解してるはずだから書籍はあんまり意味を為さないと思うなー @他の人も言ってるようにリファレンス読み込むのがいいと思う。どのページに何が書いてあるか理解把握するのが大事かな、と。あくまで重要なのはリファレンスの内容を覚えるんじゃなくて、必要な時に直ぐに取り出せるように「何処に何が書いてあるか」を理解把握すると良いと思うよ。例えばphp7系とphp8系で大幅に仕様変更があったんだけどその差異を見るにはどのページ見れば良いかとか、もっとシンプルに言うと関数のリファレンスは何処に纏まってるか、とか。 @の手順が終わったら、プログラム経験者でphp手っ取り早く学びたいならLaravelの環境を構築するかまたはWordPress作って弄り倒すのが良いと思う。 前者の理由は、ここ数年のphp開発現場はLaravelを基本としてるから。 後者の理由は、WordPressはphpで構成されているのでソースレベルで弄り倒せるようになれればclassや一通りの組み込み関数も理解出来ていると判断できるから(俺社比) 若干話変わって個人的に興味があるのは、何故phpを学習したいと思ったのかを知りたいな 聞きたい理由としては、phpって言語としても旬は過ぎたし、もしWordPressが使われなくなったらレガシーな環境を除けばphpを選択する意味が無くなってきてると個人的に感じてるのよね。(俺自身はphp好きだけどw) 例えば最近ならNode.js+TypeScript+.vueとかの方が需要高いから何故phpを学ぼうと思ったかその機会を知りたいと思いました。長文スマンでした
- 925 名前:デフォルトの名無しさん mailto:sage [2024/10/17(木) 23:37:25.31 ID:goFejqio0.net]
- 横レスおじさんだけどごめんね❤
>919 については、確かにセッション使えば自身の変数は保持できる >921 に対しては、おっしゃる通りユーザ跨げない。後述(※参照)するけど、ユーザー跨ごうとすると変則的な運用のみ使えると思う(という知見しか自分には無い)から結論非常にオススメしない。 >922 マジでオススメしない。理由はセッションIDを対象ユーザー以外で使うのは大事故に繋がるから。 (※)一応例外も挙げておくけど、【そのサービスを1人しか利用しない】という前提ならもしかしたらありかな?とは思う。逆を言えばそれくらいのレベル感じゃ無いとセッションIDの使い回しは超御法度。 つまり非常に限定的で、ローカル環境で構築したサービスや外部非公開の環境というのが前提で、もし外部に公開するサービスならセッションIDは絶対に使い回しちゃダメよ、って事。
- 926 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 07:32:13.18 ID:IRpwug8I0.net]
- >>924
> レガシーな環境を除けばphpを選択する意味が無くなってきてる 商用ならその通り ただしレンタルサーバーのような小口だと、プロセス2秒でぶった切る運用が出来るPHPの方が相性がいい だからブログにはPHP+WPの方が相性がよく、 今のところ他言語では…そういえばHugoとかあったがあれどうなったんだろ? ちなみにphp.net、読み物としては非常に優秀だが、リファレンスとして逆引きするにはイマイチだと分かった だから一通り知って、しばらく使わずに忘れて、再確認したいときに > 何処に何が書いてあるか を覚えておかないと辿り着けない (逆に他言語は逆引きするように書いているから、頭から読む読み物としてはイマイチ)
- 927 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 08:54:50.32 ID:WQ7AgxmX0.net]
- >926
うんうん、小口の場合は確かにphpですね。個人からの依頼や企業でも小規模なWEBページの依頼はphpが未だに多い印象。 php.netはそうなのよ、読み物としては立派なんだよね。phpの設定関連は読み込むと理解把握しやすい。一方で「この機能を実現する組み込み関数ってあるかな」と逆引きしたい時や、「ソース書いてて躓いた時、詰まった時」はあんまり役に立たない印象。 そこで次はどうするかというとネット記事(個人ブログ含)に行き着くんだけど、php関連のネット記事って有象無象入り混じってて特殊なアプローチ(裏技的な内容)やセキュリティガバガバのソース提示されてるから初学者はネット記事参考にしない方が良い、というね。 やっぱり実際の業務で学ぶか、WordPress作って理解するか、GitHubで学ぶとかがいいかなーと思う
- 928 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:05:17.56 ID:IRpwug8I0.net]
- >>927
内容については全文同意でいいが、>>920に戻ると、 php.netは読み物としてはMDN/MSDN/Oracleと比べて段違いにいいので、 紙好きであっても初手として通読する事を進める(他言語のリファレンスを想定しているのなら特に) どうしてもというなら全文印刷して読め、それくらい良質だ 一方で > php関連のネット記事って有象無象入り混じってて特殊なアプローチ(裏技的な内容)やセキュリティガバガバのソース提示されてるから初学者はネット記事参考にしない方が良い これは本当にその通りで、理由はPHPが糞言語でろくなコードが書けないというのも多々あるが、(927参考) JSも相当に酷いので、「主戦場がWebなので(技術的/気分的に)『初心者にも』情報発信しやすい」のが主な理由だろう Web系は馬鹿しかいないというのも通説ではあるが、 実際の所Cなんて仕事化されない限り(例えば大学の準教授で講義内容を公開するとか)上級者でもWeb記事なんて書かないから、 記事書いてる時点で大半は教える事が仕事として成立する程度のフィルタがかかってるので全然違う (すまんがNGワード規制に引っかかるようなのでバラバラに落とす)
- 929 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:06:19.93 ID:IRpwug8I0.net]
- ではどうすればいいかといえば、俺は「レビュー済み」のコードを参考にする事を勧める
- 930 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:07:10.73 ID:IRpwug8I0.net]
- 俺は上記の通り、JSではMDNのコードしか信用しない事にしてるが、それは「MDNは多数に見られてる」からだ(=酷いコードは修正済み)
StackOverflowが良質なのも、各回答がレビューされて上位順に並ぶからだ
- 931 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:07:41.36 ID:IRpwug8I0.net]
- この点、php.netは同様に、各ページの下にコードがずらずらと『上位順』に並び、
結果的に各ページにStackOverflow並の上質なコードが付随する事になってる
- 932 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:08:32.58 ID:IRpwug8I0.net]
- 初学者であれを全部読むのは辛いだろうが、あのコードも読む価値があるので余裕があれば読むべき
- 933 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:09:03.23 ID:IRpwug8I0.net]
- 大体において各ページの機能のハマりポイントをコードで解説してある
- 934 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:09:27.64 ID:IRpwug8I0.net]
- 面倒なら、ハマったときにはググると同時にphp.netのその機能のコードも読む事だ
- 935 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:10:14.73 ID:IRpwug8I0.net]
- ちなみに引っかかったらだいたいググるとQiitaで何とかなる事が多いはず
Qiitaも勿論いいサイトではあるが、結局「上位順」ではないので、StackOverflowに成れなかった、というより成り損ねた感がある これは10年ほど昔にJS界隈でKenOkabe、通称「毛の壁」が、 細かい間違いを修正するよう突っ込みまくってウザがられて荒らし扱いされ、結局コメント機能が削除された、という経緯があるらしいが 結果的に「よりよいコード、より正しい情報を発信する」(StackOverflow的価値観)より、 「僕が気持ちよく情報発信する」(ゆとり世代的価値観)を優先したので、そうなってる まあ創始者がゆとり世代だし、この判断が間違ってるかどうかも微妙で、例えば商業的意味なら「成功」となるのだが、 とにかく現状ではQiitaは玉石混淆、というよりゴミの方が多いので要注意 それでもないよりは100万倍いいので、素晴らしいサイトではあるけども
- 936 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:11:06.01 ID:IRpwug8I0.net]
- これはQiitaのユーザーの問題というよりは、やはりレビューされてない事によるものだと思ってる
同様にGitHubでも個人レベルで公開してるのは、公開の場所が違うだけで、同様に糞コードの地雷原でしかない
- 937 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:11:36.87 ID:IRpwug8I0.net]
- ただ世界的に超有名なOSS(勿論GitHub上)でも超絶糞コードな事に遭遇した事があるので、(なおC言語)
OSSで多数に見られてればコードの質が上がる、ということでもないらしい
- 938 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:11:54.86 ID:IRpwug8I0.net]
- 結局はレビュワーによるのだが、OSSでレビューで落としたら関係がそれなりに悪くなるらしいので、
長期戦略を考えたら糞コードもなかなかに落としづらいというのはあるのかもしれない
- 939 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:12:12.67 ID:IRpwug8I0.net]
- この点、PHP自体もOSSの産物だから、はっきり言って機能がデタラメで統一感もなく、
大手がガッツリ整備してる他言語(C#/Java等)と比べたら色々チグハグだが、 これもそういうものだと認識して諦めるしかない 文句があるならお前が直せ、のOSS文化そのままだ とはいえPHP8には表面的には機能が揃ってる感はあるが
- 940 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 14:14:03.60 ID:IRpwug8I0.net]
- …多分「コード」がNGワードっぽい
- 941 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 18:47:58.42 ID:9d2rbs7t0.net]
- ここは毛の壁の落書き帳です
- 942 名前:デフォルトの名無しさん mailto:sage [2024/10/18(金) 20:59:29.50 ID:IRpwug8I0.net]
- 実際の所俺は、毛の壁が超えた、ゆとり世代的レッドラインがどの程度なのかは知りたいんだけどね
Qiita上では綺麗さっぱり消されてるので確認出来ないし まあ言いたい事は、 つべこべ言わずpnp.netを読め、そして各ページのコードも読め、だ 他言語の常識でpnp.netを忌避するのは、勿体なさ過ぎる
- 943 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 10:50:17.35 ID:hAiZn1ip0.net]
- 環境: PHP 8.3.6, ubuntu24.04 LTS, oniguruma 6.9.9
mb_ereg_replace() に使う正規表現の中で (*FAIL) が使えません PHP側で (*hoge) の形の正規表現パーツを無効化しているようですが もし使えるようにする方法があれば教えて下さい 最近 oniguruma に (*SKIP) が実装されたので正規表現の高速化のために使いたいです mb_ereg_replace() https://www.php.net/manual/ja/function.mb-ereg-replace.php
- 944 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 11:21:53.55 ID:9J9C943n0.net]
- 知らんが常識的にはdllを差し替えるだけでは?
- 945 名前:947 mailto:sage [2024/10/21(月) 12:10:55.14 ID:hAiZn1ip0.net]
- >>944
ありがとうございます、PHPで使われている正規表現ライブラリは最新のものでした $ php -i | grep "onig" Multibyte regex (oniguruma) version => 6.9.9 PHP側が古い可能性もあるので一応 PHP 8.4.0 RC2 を試してみます
- 946 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 12:46:44.10 ID:9J9C943n0.net]
- >>945
6.9.9が最新ならお前は多分勘違いをしてるぞ > Master branch > Update Unicode version 16.0 > Add new operator (*SKIP) > > Version 6.9.9 > 以下略 > https://github.com/kkos/oniguruma この書き方なら、『開発中の』Master branch(=6.9.10としてリリースされるであろう物)には入ってるが、まだリリースされてない つまりどのPHPバージョンにも普通は入ってない だから自分でonigurumaをコンパイルして差し替える必要がある
- 947 名前:947 mailto:sage [2024/10/21(月) 13:48:46.27 ID:hAiZn1ip0.net]
- >>946
onigurumaの差し替えはやる予定でした、そこに気付かれるとは..すごい しかし (*FAIL) すら使えないのでonigurumaの差し替えをしても意味が無いんです 恐らくPHP側で無効にしていると思われるのですが有効にする方法をどなたか..
- 948 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 14:34:37.43 ID:9J9C943n0.net]
- >>947
> やる予定 それは実際に試して言ってる? 一般的にdllは呼ぶだけで、その前の段階で前処理なんてしない というかそれやったら、PHP側のコードをonigurumaのバージョン毎に変えないといけなくなるだろ 無駄に依存性が増えるだけになってしまう 他ライブラリなんていつどう更新されるかも分からないのに だから普通は差し替えれば動くだけ 動かないのであり、かつその原因がそちらの予想通りPHP側にoniguruma特定バージョン用のパッチが当ててある場合は、 php.iniにそれを切る為の設定が(一般的には)あるはず でも繰り返すけど、普通はそうはせず、差し替えたら動くだけ、差し替えなければ動かないだけ、だと思うよ 動かないなら、そちらの設定間違いで、うまくdllを掴めてない可能性の方が高い 実際その(*FAIL)がどういう機能か知らんが、 (* 自体は対応してないとエラーになるでしょ 普通はそのエラー自体もライブラリ、つまりonigurumaやpeclに判定させて、throwさせるものだから
- 949 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 15:05:17.60 ID:9J9C943n0.net]
- >>948 訂正
× pecl ○ pcre 分かる範囲だがphpにはpeclもあるようなので…
- 950 名前:947 mailto:sage [2024/10/21(月) 15:21:24.44 ID:hAiZn1ip0.net]
- >>948
>それは実際に試して言ってる? 実は最初から最新の Master branch (3237 commits) しか入れていません つまり oniguruma 6.9.9 のリリース版を使っていません このことを忘れてました、リリース版でも確認してみます、すみません.. そういうものですか、なるほど php.ini と oniguruma 側の確認もしてみます お時間取らせてしまって申し訳ないです、ありがとうございました
- 951 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 15:30:29.11 ID:9J9C943n0.net]
- >>950
> リリース版でも確認してみます いいね、これで確認出来る。差が出ればdllは当たってる あとは、サーバー側の設定は別のはずなので、コマンドでは動くがサーバー上では動かない場合はこれ
- 952 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 20:10:27.85 ID:QKrgL0if0.net]
- >943
preg_replaceで代替どうぞ $pattern = '/foo(*SKIP)(*FAIL)|bar/u'; $replacement = 'baz'; $subject = 'foobár'; $result = preg_replace($pattern, $replacement, $subject); echo $result; // foobaz
- 953 名前:947 mailto:sage [2024/10/21(月) 20:30:30.28 ID:hAiZn1ip0.net]
- >>951
リリース版でも試しましたが結果は変わりませんでした、 (*FAIL) は使えませんでした リリース版でも Master branch の最新版でも oniguruma 単体では (*FAIL) を使えます php.ini にも (*FAIL) などを無効化するような設定は見当たりませんでした PHPをコンパイルする前のソースも見てみたのですが該当しそうな場所を見つけられていません しかしまだまだ調査不足なのでもっと調べてみます もしかしたら思いもよらない場所にある古い oniguruma ライブラリを参照している可能性もあります 何か分かりましたらまた来ます、今日は色々教えて頂きありがとうございました!
- 954 名前:947 mailto:sage [2024/10/21(月) 21:31:17.66 ID:hAiZn1ip0.net]
- >>952
すいません!レスに気付いてませんでした! 頂いたコードで (*SKIP)(*FAIL) が正しく動作しているのを確認出来ました しかし私は mb_ereg のほうを使わなければなりません、正規表現で UTF-8 以外の エンコードを使うためです、せっかく作って頂いたのに申し訳ない.. > á おお、 /u はこんな挙動するんですね、勉強になります
- 955 名前:デフォルトの名無しさん mailto:sage [2024/10/22(火) 07:31:12.59 ID:frvkcjlG0.net]
- >954
なるほどね理解しました。根本的な解決に向けての助力は他の方が回答してくれてるので、俺は一時的な回避策(w)を提示するよ。その場凌ぎなので悪しからず $original_encoding = 'SJIS'; // 例: Shift-JIS など // 文字列を一時的に UTF-8 に変換 $subject = mb_convert_encoding($subject, 'UTF-8', $original_encoding); // preg_replace を利用して (*SKIP)(*FAIL) を使った正規表現を適用 $pattern = '/foo(*SKIP)(*FAIL)|bar/u'; $replacement = 'baz'; $result = preg_replace($pattern, $replacement, $subject); // 結果を元のエンコーディングに戻す $result = mb_convert_encoding($result, $original_encoding, 'UTF-8'); echo $result;
- 956 名前:デフォルトの名無しさん mailto:sage [2024/10/22(火) 08:51:20.86 ID:OD5ng7w50.net]
- >>953
それだと、用意したdllは使われておらず、どこかにある古いonigurumaを掴んでいるように見えるな なら、今掴まれているdllを特定して、そのファイルと差し替えるのが一番早いかと windowsなら実行中の各プロセスがどのdllファイルを掴んでいるかはprocessExplororで簡単に分かるが、 Unixだと聞いたことない(…が、あるんだろうけど) ググるとlddで静的解析は出来るらしい(使ったこと無いが) ただこれは自分でコマンドとして起動する場合用だから、 apache/nginxを起動してるユーザーで実行すれば命中するが、ただのユーザーではいまいちだな https://stackoverflow.com/questions/50159/how-to-show-all-shared-libraries-used-by-executables-in-linux https://linux.die.net/man/1/ldd (実際色々変わってるらしいので何ともだが、昔と同様の起動形態だと、 rc*.dを改変してapache起動直前にlddすれば確定する《はず》) あと、xampp環境だと php_mbstring.dll というものがある これがonigurumaかどうかは分からないが、そうだった場合、php_*となっているのは通常、 「そのものではなく、php側が用意したラッパをつけた状態でdllにした」ことを意味するので、 oniguruma単体ではなく、ラッパつけて再コンパイルする必要があるかも
- 957 名前:947 mailto:sage [2024/10/22(火) 21:24:40.11 ID:u1LoTuab0.net]
- 書き込み規制が出たので簡素化して書きます
mb_ereg_replace() で (*FAIL) が動かない原因は oniguruma のライブラリの バージョンが古いという問題ではありませんでした oniguruma 6.6.0 で追加された (?W) が使えない一方で 6.9.5 で追加された \x{HHHH HHHH} が使えるなどバージョンの違いでは説明出来ない動作がたくさん確認出来ました この問題は恐らく解決が困難だと思うので諦めます お二方、お付き合い頂きありがとうございました、勉強になりました、感謝です
- 958 名前:デフォルトの名無しさん mailto:sage [2024/10/22(火) 22:48:01.75 ID:OD5ng7w50.net]
- >>957
お疲れ すんなり行かない場合はかなりハマる案件なので、判断は妥当だと思う なおオープンソースの新機能周りってわりと普通にバグってるので、意味不明な場合はこれかも
- 959 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 06:42:46.86 ID:/9Lix2oc0.net]
- >>957
そういえば書き込み規制の件、 もしまだ原稿が手元に残ってるなら、 多少読みにくくてもいいから、バラバラにするなり、他板のテストスレに落とすなりしてもらえないだろうか 情報が有るのと無いのでは全然違うので、俺は読むから コピペ規制なら、例えばmango板は規制チェックの為の板なので、落とせるし agree.5ch.net/test/read.cgi/mango/1715675838/
- 960 名前:947 mailto:sage [2024/10/23(水) 14:05:07.85 ID:ETlmKTT60.net]
- 現時点では php-mbstring の問題だと思っています
これはPHPに後から追加するPHPの拡張モジュールです、このモジュールが oniguruma の ライブラリのファイルを参照します oniguruma は各正規表現パーツごとに有効、無効を切り替えられる仕様になって いるのですが、oniguruma を呼び出す php-mbstring 側で (?W) や (*FAIL) が 有効にされていない可能性が高いと考えています 以下のページは oniguruma の各パーツごとのオプション名を説明するページです s://github.com/kkos/oniguruma/blob/master/doc/SYNTAX.md このページを "Set in:" でページ内検索すると各パーツがどのプログラム言語用の 正規表現ルールに適用されるかが分かります (?W) は 30番目の ONIG_SYN_OP2_OPTION_ONIGURUMA というオプションを 有効にすると使えるのですが、これが適用されるルールは 「Set in: Oniguruma」と 書いてあるので正規表現ルールを "Oniguruma" と指定しないと使えません しかし php-mbstring のソースを見てみると選べる正規表現ルールの中に "Oniguruma" は ありませんでした、つまり正規表現ルールを "Oniguruma" に変更出来れば (*FAIL) なども 使えるようになる可能性があります(そう簡単に上手くいくとも思えませんが)
- 961 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 14:05:25.05 ID:uHtllYPK0.net]
- その辺まで行くとissue読み漁らないとたどり着かない領域かもね
- 962 名前:947 mailto:sage [2024/10/23(水) 14:43:46.47 ID:ETlmKTT60.net]
- あと、話を簡素化するために嘘を書いてしまったので訂正します
php-mbstring ライブラリが参照している oniguruma ライブラリを教えて頂いた ldd コマンドで調べたところ、以下のように別ファイルを参照していました php-mbstring が参照していたパス /usr/lib/x86_64-linux-gnu/libonig.so.5.4.0 私が入れた oniguruma ライブラリのパス /usr/local/lib/libonig.so.5.4.0 php-mbstring が参照していたライブラリのファイルサイズは私が入れたライブラリの 半分ほどだったので恐らく古いライブラリだったのだと思います そこで php-mbstring が参照しているライブラリを最新の Master branch のライブラリに 置き換えて (*FAIL) が使えるかを試してみましたが結果は変わらず、使えないままでした >>944 でご指摘して頂いたことは的を射ていたということになります お詫びして訂正致します、すみませんでした
- 963 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:17:15.79 ID:/9Lix2oc0.net]
- >>962
いや全く謝る必要はない その辺まで行ってる時点で大したもんだし、よく言われてる「報告」についても、君はよく出来てるよ > oniguruma は各正規表現パーツごとに有効、無効を切り替えられる仕様になって > いるのですが、oniguruma を呼び出す php-mbstring 側で (?W) や (*FAIL) が > 有効にされていない可能性が高いと考えています なるほど、これを知ってたから最初から無効化を疑ってたわけね 俺は知らなかったから、一般論で答えてしまったが 正規表現の場合は互換性が問題になるから一々細かくやらないと駄目なのかもね > 正規表現ルールを "Oniguruma" と指定しないと使えません これは微妙にちと違っていて、あの書き方だとただ単にフラグだから、C的にありがちなのは、以下α (最近使ってないなら文法間違ってるかもだが) 多少行儀のいい場合:α #define ONIG_SYN_OP2_OPTION_ONIGURUMA 0x04000000 // oniguruma内 onigSyntaxType.op2 |= ONIG_SYN_OP2_OPTION_ONIGURUMA; // php_mgstring内 あるいはドベタに:β onigSyntaxType.op2 |= 0x40000000; // php_mbstring内 "Oniguruma"指定の場合は、多分:γ OrigSyntaxType Oniguruma = {0xfff7d556, 0x47eb7bd2, 0x87a00bdb}; // oniguruma内 OrigSyntaxType origSyntaxType = Oniguruma; // php_mbstring内 要するにビットを立ててるだけなので、op2の[30]を立ててしまえば使えるようになる Oniguruma指定は一番手抜きが出来て楽だが、 php_mbstringの機能追加タイミングがOnigurumaのバージョンアップと同期してしまう だから互換性を重視しつつ、必要なタイミングで上位機能を取り込みたい場合は、普通はαにする そして結果的にOniguruma指定と同じになる事を(長期的に)目指す
- 964 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:18:06.80 ID:/9Lix2oc0.net]
- なので検索する場合は、Onigurumaが無ければ、
ONIG_SYN_OP2_OPTION_ONIGURUMA を探し、それもなければ 0x を探す(一応0Xでもいいらしいのでそれも) とまあ、ここまで書いてると、「そこまで言うならお前が見ろや!」なので見てみる 最新版とか知らんのでpnp.netのdownloadページの8.3.12をDLした(CurrentStable) ああ俺は、他人のコードを読み足りない、と認識してるから、こういう機会があれば読む事にしているだけだ 今風に言えば、べっ別に、あんたの為に読んだ訳じゃないんだからね!!!(だが男だ) さて上記検索試すが、空振る。そして後付ではあるが php-8.3.12>grep -n -r -i OnigSyntaxType * ext/mbstring/php_mbregex.c:62: OnigSyntaxType *regex_default_syntax; ext/mbstring/php_mbregex.c:455:static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, size_t patlen, OnigOptionType options, OnigSyntaxType *syntax) ext/mbstring/php_mbregex.c:489:static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionType option, OnigSyntaxType *syntax) ext/mbstring/php_mbregex.c:595: OnigSyntaxType **syntax) ext/mbstring/php_mbregex.c:997: OnigSyntaxType *syntax; ext/mbstring/php_mbregex.c:1268: OnigSyntaxType *syntax; ext/mbstring/php_mbregex.c:1332: OnigSyntaxType *syntax; ext/mbstring/php_mbregex.c:1463: OnigSyntaxType *syntax = NULL; ext/mbstring/php_mbregex.c:1591:static void _php_mb_regex_set_options(OnigOptionType options, OnigSyntaxType *syntax, OnigOptionType *prev_options, OnigSyntaxType **prev_syntax) ext/mbstring/php_mbregex.c:1608: OnigSyntaxType *syntax, *prev_syntax; 当たり前だが、変化する値側ではなく、固定的な型名で検索するべきだった
- 965 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:19:18.35 ID:/9Lix2oc0.net]
- そして順当なら php_mbregex.c:1591:static void _php_mb_regex_set_options なので見てみる
prevをデフォに戻して新しい値をセットするだけのようだ そもそもprevが何故いるのか?はかなり疑問だが、まあいい とにかくビットを立ててしまいたいだけなら、ここを改造して、上記βしてしまえば、ここを通る限り常にビット30が立つようになる コンパイル通るかどうか知らんが、例えば具体的には、 MBREX(regex_default_options) = options; MBREX(regex_default_syntax) = syntax; (*syntax)->op2 |= 0x40000000; // これを最後に追加 MBREXはマクロ #define MBREX(g) (MBSTRG(mb_regex_globals)->g) MBSTRGもマクロ mbstring.h:118:#define MBSTRG(v) ZEND_MODULE_GLOBALS_ACCESSOR(mbstring, v) ZEND_MODULE_GLOBALS_ACCESSORもマクロ Zend/zend_API.h:255:#define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) ZEND_TSRMG(module_name##_globals_id, zend_##module_name##_globals *, v) Zend/zend_API.h:270:#define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) (module_name##_globals.v) 2つ出るのは#ifdefと相場が決まっており、今回も#ifdef ZTS らしいが、ZTSってなんだっけ? まあとにかくこの辺はここまででいい、とにかく更新してるだけっぽいし
- 966 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:21:26.39 ID:/9Lix2oc0.net]
- その他、
ext/mbstring/php_mbregex.c:489:static size_t _php_mb_regex_get_option_string ext/mbstring/php_mbregex.c:594:static bool _php_mb_regex_init_options とか、いかにもなので君には分かるだろう 真面目に直すのならこの辺だね ちなみに regex_default_syntax を修正してもいけるはず。これは ext/mbstring/php_mbregex.c:84:pglobals->regex_default_syntax = ONIG_SYNTAX_RUBY; とモロクソに書いてある 君の読み通りなら、そこを pglobals->regex_default_syntax = ONIG_SYNTAX_ONIGURUMA; // RUBYからONIGURUMAに変更 ついでに ext/mbstring/php_mbregex.c:601:*syntax = ONIG_SYNTAX_ONIGURMUA; // RUBYからONIGURUMAに変更 なのだろうね grep -n -r ONIG_SYNTAX * でONIG_SYNTAX_RUBYが引っかからないから、おそらくONIG_SYNTAX_RUBYはoniguruma側で定義されてる だからoniguruma側で同様にgrepして ONIG_SYNTAX_ONIGURUMA が定義されてればいけるかも てかこれ見る限り、毎回initしてるのか?(まあdllならそうかもだが) そして _php_mb_regex_init_options内case '*' の部分をphp.iniかどこかで設定出来るようにしてるはずではあるが ただ普通に考えて、prev_syntaxって何ぞ?ではある regexで「今回の」文法を切り替えるのは分かるが、「前回の」は明らかに要らないので、 それがある=何か無理矢理切り替えて動かしてる感あり、なので、単純にビット立てるだけでは駄目かもよ ダラダラ書いたけどこんな感じ とはいえ、君はほぼ辿り着いてるよね php_mbstringのコンパイル環境の立ち上げがすんなり行くかはやってみないと分からないが
- 967 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:21:59.96 ID:/9Lix2oc0.net]
- あとついでに言うと、推定だが、順当には、
当初:php->onigurumaを直接呼び出し おそらくonigurumagaの更新でAPIが変わって、 現在:php->php_mbstring->oniguruma と呼び出し、 php->php_mbstring間のAPIは固定、 php_mbstring->onigurumaでonigurumaのAPI変更に対応、 つまりonigurumaが変更されてもphp_mbstringの変更のみで対応し、php 本体は一行も変更無しでいけるように分離した、 だと思うので、君の予想する「oniguruma用に何かしてるコード」はphp_mbstring側に全部突っ込まれてるはず まあこれも一般論だが
- 968 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:31:46.47 ID:/9Lix2oc0.net]
- >>963
分かる範囲だが一応訂正 × (最近使ってないなら文法間違ってるかもだが) ○ (最近使ってない か ら文法間違ってるかもだが)
- 969 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 22:52:29.22 ID:/9Lix2oc0.net]
- さらについで
ONIG_SYNTAXは仕様としては任意のビットを立てたり落としたり出来るはずだが、 実際はこの手の奴は大体テストが甘くて、組み合わせによっては動作しなかったりする ではどうするか?と言えば、テスト済みであろう組み合わせに出来るだけ近い物を使う 今回ならRUBYかONIGURUMAに一番近いものだが、まあ、両方とも似たり寄ったりだな しかしよく見ると、RUBY 指定なら ONIG_SYN_OP2_ASTERISK_CALLOUT_NAME は立ってるではないか php_mbstringのソースだけ見るとデフォはRUBY指定だから動くはず となると何らかの理由で _php_mb_regex_init_options で他指定に切り替えられてるのか? ならば手抜きで直すなら、 ext/mbstring/php_mbregex.c:607-656を全部コメントアウトして case 文を無視、 何をどう指定されても ONIG_SYNTAX_RUBY(あるいはONIG_SYNTAX_ONIGURUMA) になるようにしてしまうとか、かな
- 970 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:37:30.51 ID:/9Lix2oc0.net]
- >>960
てゆうかすいません、モロクソに書いてましたわ dllだけ差し替えて'r'指定で行けるはずですわ もうちょっと眺めて投稿すべきだった(これもかもだが) (すまぬが引っかかるのでバラバラに落とす)
- 971 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:40:00.93 ID:/9Lix2oc0.net]
- _php_mb_regex_init_options は各関数で毎回呼ばれてる
(_php_mb_regex_ereg_replace_execからも)
- 972 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:41:25.78 ID:/9Lix2oc0.net]
- そしてこれをPHPから呼ぶのが mb_regex_set_options で、
- 973 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:42:52.32 ID:/9Lix2oc0.net]
- > Regex 構文モード(ひとつだけ設定可能です)
- 974 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:43:08.35 ID:/9Lix2oc0.net]
- > https://www.php.net/manual/ja/function.mb-regex-set-options.php
とモロクソ書いてますな そして何故かそのphp.netページにはデフォが何か書いてないが、 'r'指定すればRUBY指定(=ONIG_SYN_OP2_ASTERISK_CALLOUT_NAMEがON)になる 'p'指定でもいけるかも? そしてこのフラグは mb_ereg_replace でも使えるらしい。つまり、 mb_ereg_replace( string $pattern, string $replacement, string $string, ?string $options = null <- ここに指定、例えば 'r' or 'p' ): string|false|null これで使えるなら、dllだけ差し替えればC側の修正は不要(そして多分これで上手く行く)
- 975 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 23:43:51.89 ID:/9Lix2oc0.net]
- それでも駄目、或いはRUBY指定やPERL指定では使えない機能も使いたいなら、
_php_mb_regex_init_optionsに case 'o': *syntax = ONIG_SYNTAX_ONIGURUMA break; を追加して、'o'指定してやるとかすればいけるはず 敗因は、oniguruma側で細かくregexを切り替えられる事を知らない人にとっては > Regex 構文モード(ひとつだけ設定可能です) とか意味不明だからだな 最初にそこを言ってくれてれば、ピンと来た人がいたかも?
- 976 名前:デフォルトの名無しさん mailto:sage [2024/10/24(木) 01:07:24.54 ID:D6fJlQ4l0.net]
- >>974
訂正、perlなので' p と思ってしまってたが z だった orz × 'p'指定でもいけるかも? ○ 'z'指定でもいけるかも? × 例えば 'r' or 'p' ○ 例えば 'r' or 'z' あと var_dump(mb_regex_set_options(null)); でデフォを確認出来る 多分 "r" と出るはず あと >>969 > しかしよく見ると、RUBY 指定なら ONIG_SYN_OP2_ASTERISK_CALLOUT_NAME は立ってるではないか > php_mbstringのソースだけ見るとデフォはRUBY指定だから動くはず の部分も一部訂正だが、これは俺だけが悪いのではなく、GitHubのSYNTAXページも間違ってるな 上側の説明部分では > 28. ONIG_SYN_OP2_QMARK_BRACE_CALLOUT_CONTENTS (enable (?{...})) > Set in: Oniguruma, Perl, Perl_NG > 29. ONIG_SYN_OP2_ASTERISK_CALLOUT_NAME (enable (*name)) > Set in: Oniguruma, Perl, Perl_NG となってて、Onigurumaならフル機能のように書かれてるが、下の表だと 28,29はOnigurumaでは付いてない まあどっちが正しいのかは謎だが、意味不明な挙動するのはこの辺の問題もあるかもよ これでは結局の所、RUBYやONIGURMUA指定で欲しい機能(29と30か?)が動くかどうかがよく分からんし (まあ自前で立ててやればいいんですけどね)
- 977 名前:947 mailto:sage [2024/10/24(木) 12:35:15.79 ID:CfDH66X40.net]
- ありがとうございます、おかげ様でゴールが見えてきた感じです
すごい解析力に脱帽でした、読みながら「すごいな〜」を連発してしまいました ちょっと昔に DAN KOGAI さんを見たときも衝撃を受けましたがそんな感じでした 本当は (*FAIL) が動くのを確認してからレスしたかったのですが 何かにハマっているらしくまだ成功していません しかしもう PHP の問題というより oniguruma の問題ですので ここから先は自力でなんとかなりそうです > 28. 29. これは表が間違ってます、以下は ONIG_SYNTAX_RUBY のオプション指定です https://github.com/kkos/oniguruma/blob/43a8c3f3daf263091f3a74019d4b32ebb6417093/src/regparse.c#L122-L162 #define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby) https://github.com/kkos/oniguruma/blob/43a8c3f3daf263091f3a74019d4b32ebb6417093/src/oniguruma.h#L444 今は (*FAIL) が使えるようになるかの手っ取り早い確認のために oniguruma ライブラリ側をいじり、 上記の ruby のオプション指定に oniguruma のものをコピペして動くかどうかを試していますが 今のところ結果が変わりません (ライブラリの置き換えに失敗している?) ちょっと日数がかかるかも知れませんが成功したらご報告に伺います、ありがとうございました!
- 978 名前:デフォルトの名無しさん mailto:sage [2024/10/24(木) 22:06:48.35 ID:D6fJlQ4l0.net]
- >>977
> これは表が間違ってます 確認した。md打つときに列が一個ずれて、onigがyesになるべき所がRubyの列に入ってるんだな 誰か余裕があったら指摘してあげて > 上記の ruby のオプション指定に oniguruma のものをコピペして動くかどうかを試していますが いいね。この方が早そうだ > ちょっと日数がかかるかも知れませんが成功したらご報告に伺います、ありがとうございました! はいまあ頑張って ちなみに1つバグ、というか不一致を発見した php_mbregex.c内、_php_mb_regex_init_options関数で、単純にRubyの r 指定等すると上書きしている為、 『最初に』指定しないと正しく動作しない(それ以前に指定したフラグが全部キャンセルされる) しかしphp.netには『最後に』と明記してある > モードを設定する際には、モード文字は最後に指定しなければなりません。 > https://www.php.net/manual/ja/function.mb-regex-set-options.php これも誰か余裕有ったら指摘してあげて。勿論報告者の手柄にしていい 本来はPCRE側、つまりpreg_replaceと同様にすべき となると多分フラグの順は問わないので、 2パスにして1周目でRegex構文モードを、2周目で各フラグを設定するようにCを修正するのが正しい ドキュメント修正で済ませる場合は上記の通り、『最後に』と修正すれば終了 (Cの修正案が要るなら俺が書いてもいい、が、手続きとか知らんし面倒だから誰かやってくれ、勿論報告者が発見した事にしていい) だからまあ、挙動不審なのはもしかするとフラグの指定順がまずいのかも
- 979 名前:デフォルトの名無しさん mailto:sage [2024/10/24(木) 22:08:58.49 ID:D6fJlQ4l0.net]
- > すごい解析力に脱帽でした
お世辞乙だがマジレスすると、実は普通に読めて、それがOSSの定義だったりするので、そんなにすごくもない phpも30年間OSSとしてずっとメンテされており、当たり前だが多くの人が読めるからメンテ出来てる だから逆に言えば、読めないコードはOSSとしては生き残れないし、30年は淘汰に十分な期間ではある よって、長寿OSS、つまりphpやGNUやLinuxは、OSSに参戦するレベルの連中ならある程度読めて当然で、 「僕が読めないから汚いコ ードだ」と寝言ほざいてる奴には「お前の頭がOSSの域に達してないだけだ馬鹿タレ」と返していい ただ読めると言っても実際に読んでいるわけではなくて、 この仕様ならこういう作りだろうなという予測通りになっているのをなぞっているだけ だから逆に、初心者や、まだ淘汰されてないOSSのコ ードとかは、普通に読めない (読む価値無いから無視でいいのだが) だから今回は > 以下のページは oniguruma の各パーツごとのオプション名を説明するページです これが大きかった そしてこれがpnp.net上のRegex構文モードと対になってるのが分かると、なるほどね、となった まあ結局、一通り出来るようになって、書くのには苦労しなくなると、あとは仕様の理解度で差が出る、ということ php_mbregexのコ ードは悪いコ ードではないね 愚直にやってるだけのドベタなコ ードで、すごくもないが、でもこういうコ ードがOSSとしては長生きするのだろうよ (変な改行はNGワード逃れ)
- 980 名前:947 mailto:sage [2024/10/25(金) 21:53:01.03 ID:hP0G6XWW0.net]
- > OSSに参戦するレベルの連中ならある程度読めて当然
これが出来るようになることがどれだけすごいことか.. ここでこうやって語って下さるだけでも私含め誰かのためになるめちゃめちゃ 貴重な存在ですよ、いつまでも元気で現役して下さい! > OSS 淘汰 後で手を入れる人のことまで考えてコーディングされていたんですね そこまで考えてませんでした、目からうろこです > 間違いの報告 私はC言語を知らないので間違いの確認作業が出来るか自信がありませんが確認出来たら 報告しに行きますね (ここの回答者様のほうが適任だと思いますのでどなたか余力のある方は是非..)
- 981 名前:デフォルトの名無しさん mailto:sage [2024/10/26(土) 20:57:24.64 ID:BX88EvoL0.net]
- >>980
> 私はC言語を知らないので それでソースファイル当たるとは勇者だな。ただ姿勢としては正しい ソースなんて読める読めないではなく、読む読まないだし、 そもそも読めない奴こそ勉強になるから読めであり、 読める奴(=そのコード構成が自分でも組める奴)が読んでも得る物はあまりない > 間違いの確認作業が出来るか自信がありませんが確認出来たら > 報告しに行きますね Cに関しては俺がフォロー出来るが、それ以前にバグって無さそう(すまんが俺の勘違いっぽい) よく見ればフラグは optm |= で溜めてて、文法の切り換えは *syntax = なので上書きしてない だから正確には、 × モード文字は最後に指定しなければなりません。 (現在の表記) ○ 最後に指定したモード文字が有効になります。 ではあるが、現在の表記でも問題はないはず なおonigurumaの表の間違いはGitHubのissuesに凸すれば多分本人(kkos)がすぐ直してくれる そちらはonigurumaをよく知ってるみたいなので、こちらはやってみてどうぞ
- 982 名前:947 mailto:sage [2024/10/27(日) 14:13:33.60 ID:heVNiBfi0.net]
- > そもそも読めない奴こそ勉強になるから読めであり
そうですね、読んでて色々勉強になってます 書けと言われたらさっぱりですが読むほうでは少しだけ進歩したな、とは感じます > それ以前にバグって無さそう これは良かったです、正直私には荷が重かったのでw > モード文字は最後に指定しなければなりません これは mbstring の作者さんが意図するところがはっきり分からないので悩みます 「最後の文字だけ取り出せば指定されているモードが分かる」という仕様に することを視野に入れているのかも知れませんし.. 一応英語のページも見ましたが日本語と同じ意味で書いているようです https://www.php.net/manual/en/function.mb-regex-set-options.php > oniguruma の表 この SYNTAX.md は oniguruma 作者さんが作ったページではなく第三者が作ったものを マージしたものらしく、ページが作られてから1年弱で更新が止まってます https://github.com/kkos/oniguruma/commits/master/doc/SYNTAX.md 最後の更新から5年近く経っていて情報も古くなっています 私がやるならこのページを oniguruma 6.9.9 のものに更新します しかし今は php で (*SKIP) を動かすことを目指しているのでその後にやりますね oniguruma で指定されている option を読み込んであの表を出力するプログラムが あったら便利そうです、いつか作るかも知れません
- 983 名前:デフォルトの名無しさん mailto:sage [2024/10/28(月) 10:05:20.25 ID:l7XbYqqi0.net]
- >>982
言い方が悪かったかもしれないが、php.netの表記は直す必要がない。(直すべきではない) プログラミング等においては、 ドキュメント記載の動作範囲⊆実際の動作範囲 である事は絶対に必要だが、書いてない範囲は動いても動かなくても問題ないから。 (今回は、最後に書けば確実に動くので問題ない。 記載を変更したら何か変更があったかと勘ぐられ、余計におかしくなる) だからphp側については今回は何もする必要がない。 > これは mbstring の作者さんが意図するところがはっきり分からないので悩みます これはちと違ってて、仕様は実装に依存すべきではないし、してはいけない。 というか、仕様を変更するとこれまで動いてたコートが動かなくなる(=互換性が無くなる)可能性が出てくるので、 原則として、仕様は追加は出来るが削除は出来ない。 逆に実装は変わるものだし、(互換性を保たれている限り)変わってもいいものだ。 だから仕様が実装に依存した場合、初期実装は楽だが、わりと早々に破綻する。 よって、本来は、最初の最初に仕様を未来永劫変更せずに済むレベルまで練るべきだし、 多少実装が困難な仕様でも、それが良い仕様なら、頑張って実装するしかない。 (主従関係でいえば、仕様が主で実装が従)
- 984 名前:デフォルトの名無しさん mailto:sage [2024/10/28(月) 10:05:40.31 ID:l7XbYqqi0.net]
- ただ、
○ ドキュメントを読めば使える ◎ ドキュメントを読まなくても使える なので、今回はグダグダ言わずにpcreと全て揃えるのが理想で、目指す所は 既存のコードを mb_* とするとマルチバイト対応になるだけで、全て動く、ではあるが、 現実的には無理だし、phpの場合は仕様自体がわりとグダグダなので、 多少でも綺麗にしていく為には新規部分は(従来の汚い仕様を無視して)綺麗に作るしかなく、 まあ許容範囲だと思うよ。 見た目、 A, 元々は記載通り「最後に書く必要があった」が、pcreと揃えるよう修正して「いつ書いても動く」ようになった B. 元々何も記載無かったが、複数書いた場合等の動作が曖昧になるので、 「確実に動く条件」を記載するように求められ、書いた ように見える。 なお仕様を自由に決めて良いなら、 そもそも「モード」を「フラグ」に突っ込むべきなのか?という話で、 (php.netでは纏めて「オプション」「パターン修飾子」と呼称されてるので曖昧になってる) 例えばJSなら String.replace(/regular expression/flags, replacement, mode); // modeでRubyやonigurumaモードを切り替える で終わってた気がするし、 これなら「ひとつしか指定出来ません」「最後に指定しなければなりません」はそもそも必要なくなる。 しかし使いもしない引数を無駄に増やすのもよろしくないし、フラグに突っ込んでしまえ、の判断もありだろう。 (pcreもそうなってるし)
- 985 名前:デフォルトの名無しさん mailto:sage [2024/10/28(月) 10:05:57.25 ID:l7XbYqqi0.net]
- > しかし今は php で (*SKIP) を動かすことを目指しているのでその後にやりますね
それで正しい。義務感でやるものではないし、面倒なら放置でいい。 (というかこの位緩くないと続かない。だいたい昨今のSNS疲れとかは義務感から来てるものだし) だからまあ、「この表は自分も今後とも使うので正確であって欲しい。 とりあえず自分用に更新版作ったから上げとく」位でいい。 そしてそれをpythonにやらせたのなら、それもついでに上げとく、程度で十分だ。
- 986 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 00:01:17.52 ID:R9Dn8Crp0.net]
- 堂島の龍・・・ って言ったんだ
- 987 名前:947 mailto:sage [2024/10/29(火) 11:56:37.23 ID:FIsrbLEd0.net]
- > php側については今回は何もする必要がない
了解です、これは分かってましたので大丈夫です > 原則として、仕様は追加は出来るが削除は出来ない 言われてみれば確かに.. 実装を仕様にしたせいで実際に破綻した経験もあったり(ぉぃ) > pcreと全て揃えるのが理想 確かにそうですね > A. B. なるほど、"仕様が主" ということを考えると納得の推察です > フラグに突っ込んでしまえ それでオプションとモードが混ぜてあったんですねw > 義務感でやるものではない そうですね、でも SYNTAX.md の更新は私がやりたいと思ってるのでやると思います ミスが出ないように少しづつ進めるつもりです、なので完成は来年になるかも知れません ただ、私にはオプションの説明文は書けないのでソースのコメントをコピペするだけの 手抜きになると思います ( "説明文 == 仕様" なので ) PHP で (*SKIP) を使えるようにする件もあと少しでなんとかなりそうです 使えるように出来たら修正箇所を書きにまた来ます、ありがとうございました!
- 988 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 14:57:45.06 ID:HnPnA3Oe0.net]
- すまんけど参考に問題と結論をまとめてほしい
- 989 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 20:54:54.00 ID:zqRlJI/00.net]
- 次スレ
【PHP】下らねぇ質問はここに書き込みやがれ 15 https://mevius.5ch.net/test/read.cgi/tech/1730202739/
- 990 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 22:11:10.45 ID:zqRlJI/00.net]
- >>988
問題: PHPで (*SKIP) が使えない (>>943) 結論: 現在は使えないのが仕様 php8.3.12(最新安定版)ではphp_mbstringが対応していない oniguruma6.6.9(最新リリースバージョン)にも入ってない(開発したばかりで未リリース状態) なので通常は>>952,955で公式リリースを待つが、 パフォーマンスの問題、或いは(現在開発中のphpアプリの)リリース時には使えるようになっているという読み等で、 GitHub上のonigurumaソースを自前でコンパイルして接続して使うのは自由 この場合の詳細は247が成功した後に報告してくれるから待てばいい 現在の作戦(981)の内容は以下(マクロは大文字で表記) onigurumaは設定を自由に変更出来る いくつかあるプリセットの内、ONIGURUMAを指定すれば(*SKIP)が使えるが、RUBYを指定しても使えない 現在のphpではデフォでRUBY指定であり、ONIGURUMA指定は出来ない --- (α) なので、oniguruma側のRUBY設定値をONIGURUMA設定値で上書きし、 php側でRUBY指定しててもONIGURUMA指定での機能が使えるようにする これだとonigurumaの再コンパイルだけで済むはず(=php_mbstringは変更無く使える) この場合の問題は、ruby指定とoniguruma指定で完全な互換性がなかった場合に、(なお実際どうなのかは知らん) 他ソフト(laravel)等と組み合せると一部誤動作する可能性が出てくる事だが、 この場合はRUBYではなくEMACS等、 どう考えても誰も使ってないであろうマクロを潰せばいいだけなので、大した問題ではない (とはいえ商用用途ではこれも許されないだろうが)
- 991 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 22:42:58.65 ID:zqRlJI/00.net]
- 真面目に直すなら、αを修正してphp側からONIGURUMA指定出来るようにすればいい
これは970に書いたとおり、 php_mbregex.c:489:static size_t _php_mb_regex_get_option_string php_mbregex.c:594:static bool _php_mb_regex_init_options の2関数を修正すればよく、下側は979に書いたとおり以下3行追加、上側はその逆を追加するだけ(多分) case 'o': *syntax = ONIG_SYNTAX_ONIGURUMA break; この辺やる気有るのならCのソースは俺が書いてもいいが、報告その他は全部やってくれ 報告の仕方は https://www.php.net/get-involved の通り ただしバグ修正ではなく仕様追加なので、メンテナの判断により(ソースコードが妥当でも)却下される可 能性はある(改行は規制回避) >>990 すまぬ一部修正、規制に引っかかったついでに最後の段落書き足したら大文字にするのを忘れた × ruby指定とoniguruma指定で ○ RUBY指定とONIGURUMA指定で
- 992 名前:947 mailto:sage [2024/11/02(土) 11:20:08.91 ID:grhM95Vo0.net]
- どうやら正規表現の syntax を RUBY から ONIGURUMA に変えるだけではダメそうです
この変更で (?W) が使えるようになったので syntax の切り替えは出来ているのですが、 正規表現に (*FAIL) や (*SKIP) を使うとエラーになります php_mbregex.c の 473行目のエラー処理が実行されます github.com/php/php-src/blob/2b10cd1bebde7b9844ebb6e3e60127dfe7b195c5/ext/mbstring/php_mbregex.c#L473 これを解決するには php_mbregex.c と onigurumaライブラリ を深く理解する必要があり、 このスレのみなさんにとっても簡単な問題ではないと思います そのため、ここは一度戦略的に撤退し、次の好機をうかがうことにしました 長々とお付き合い下さりありがとうございました!
|

|