php の eval 関数を使おうと思っています。
文字列が渡されたときに不正なコードが紛れ込まないように「文字列である」ことを判定しようとしています。
次のようなルールを正規表現で実現しようとしています。
- 前後にあるスペースはOK
"
で始まれば"
で、'
で始まれば'
で終わる"
の囲みの時、途中に"
があってはならない'
の囲みの時、途中に'
があってはならない
3.4.の部分で 後方参照の指定を使っています。しかしながら、これでは思ったような結果が得られていません。全ての結果が OK
になります。
php
1$testData = [ 2 ' \'123abc\' ', // OK 3 ' "123abc" ', // OK 4 ' "123\'.\'abc" ', // OK 5 ' \'123"."abc\' ', // OK 6 ' \'123\'.\'abc\' ',// Should be NG but OK 7 ' "123"."abc" ', // Should be NG but OK 8 ' "123".\'abc" ', // Should be NG but OK 9]; 10 11foreach($testData as $test){ 12 if(preg_match("/^\s*([\"'|'])[^\1]*?\g{1}\s*$/", $test)){ 13 echo "OK:".$test; 14 }else{ 15 echo "NG".$test; 16 } 17 echo "<br>"; 18}
php
1OK: '123abc' 2OK: "123abc" 3OK: "123'.'abc" 4OK: '123"."abc' 5OK: '123'.'abc' 6OK: "123"."abc" 7OK: "123".'abc"
後方参照では \g{1}
を使っています。\1
でも良いと思うのですが…全て NG になってしまうので \g{1}
にしました。ここも理由がわかっていません
[^\1]
の部分を [^\g{1}]
にすると全てNGになってしまいます…
後方参照を [^...]
内では使えないのでしょうか?
もし、それが理由だとしたら、上記のルールで判定できる正規表現はどの様になるでしょうか?
よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/05/19 05:26