Nucleus(JP)フォーラム

NucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。

ログインしていません。

#1 2007-05-05 07:14:20

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

NP_match
ソースコードは、Wiki にあります。

スキンの、<%if%>構文を拡張するためのプラグインです。Nucleus 3.3 で使えます。3.24 以前の版では、NP_ExtendedIf を用いてください。

このプラグインは、NP_ExtendedIf の後継です。大幅に機能拡張してあり、通常の単純比較による分岐に加えて、正規表現を用いたマッチでの分岐なども可能です。パフォーマンスの向上も意識して作成してあります。

NP_or, NP_and
ソースコードは、Wiki にあります。

スキンの、<%if%>構文で、『or』や『and』で条件分岐するためのプラグインです。Nucleus 3.3 で使えます。

NP_if
ソースコードは、Wiki にあります。

テンプレート(アイテム・テンプレート及びコメント・テンプレート)とブログ記事中で、<%if%>構文を利用するためのプラグインです。ブログ記事での記述は、Nucleus 3.3 で使えます。なお、このプラグインをテンプレートもしくは記事中で用いる時、条件がたとえ偽の場合でも表示はされませんがパースはされますので、処理の重いテンプレート変数の条件分岐には向きません(スキンでは大丈夫です)。

オフライン

#2 2007-05-15 08:21:49

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

>Katsumiさん
お世話になります。Geoです。
質問なのですが
<%if(match,itemid=^(64|128|256)$,ereg)%>
これで複数の条件にマッチさせようとします。
該当条件(上記で言えば、64,128,256)が無い場合なのですが

NP_match - Regular expression error:
なるエラーが出ます。

マッチしない場合の処理が出来ないため困っております。コードの書き方がまずいのでしょうか。

オフライン

#3 2007-05-15 08:44:45

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Geo さんの発言:

<%if(match,itemid=^(64|128|256)$,ereg)%>
これで複数の条件にマッチさせようとします。
該当条件(上記で言えば、64,128,256)が無い場合なのですが

NP_match - Regular expression error:
なるエラーが出ます。

あ、バグですね。ereg 関数の戻り値について、勘違いしてたみたいです。とりあえず、

<%if(match,itemid=/^(64|128|256)$/,preg)%>

を試してみてください。

ereg/eregi の方はデバッグしないと使えないみたいです。ちょっと時間がかかるかもしれません。preg の方が万能なので、とりあえずこちらを使ってみてください。混乱させて、どうもすみません。

オフライン

#4 2007-05-15 08:55:24

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Katsumi さんの発言:
Geo さんの発言:

<%if(match,itemid=^(64|128|256)$,ereg)%>
これで複数の条件にマッチさせようとします。
該当条件(上記で言えば、64,128,256)が無い場合なのですが

NP_match - Regular expression error:
なるエラーが出ます。

あ、バグですね。ereg 関数の戻り値について、勘違いしてたみたいです。とりあえず、

<%if(match,itemid=/^(64|128|256)$/,preg)%>

を試してみてください。

ereg/eregi の方はデバッグしないと使えないみたいです。ちょっと時間がかかるかもしれません。preg の方が万能なので、とりあえずこちらを使ってみてください。混乱させて、どうもすみません。

早速のご連絡ありがとうございます。が・・・
どうもこちらもエラーが出ている様子です。合致していてもアウトという結末に・・・(TT
お手数ですが、よろしくお願いいたします。

あと、加えてなのですが、elseifは利用できませんか?

オフライン

#5 2007-05-15 09:06:03

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

<%if(match,REQUEST_URI=/blog/)%>

こちらの条件で、URLの指定を行ったときなのですが、どうも
/blog/hoge/

と、二階層目をつけるとうまくいかない感じがします。
うーむ :?

オフライン

#6 2007-05-15 10:39:40

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

/blog/hoge/ のケースにも、preg のケースにも当てはまることですが、記述の中に余計なスペースが入ったりしていませんでしょうか?スペースが入っていると、それも文字列の一部と解釈してしまうので、確認してください。それと、サーバ変数:REQUEST_URI は大丈夫ですよね(IIS では使えません)。

elseif は使えるはずです。

<%elseif(match,itemid=/^(64|128|256)$/,preg)%>

のように記述してみてください。

オフライン

#7 2007-05-15 10:53:26

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Katsumi さんの発言:

/blog/hoge/ のケースにも、preg のケースにも当てはまることですが、記述の中に余計なスペースが入ったりしていませんでしょうか?スペースが入っていると、それも文字列の一部と解釈してしまうので、確認してください。それと、サーバ変数:REQUEST_URI は大丈夫ですよね(IIS では使えません)。

elseif は使えるはずです。

<%elseif(match,itemid=/^(64|128|256)$/,preg)%>

のように記述してみてください。

REQUEST_URI は大丈夫です。
スペースも入っていないんですね。。。。

<%if(match,REQUEST_URI=/^(/hogehoge/|hoge2|)$/,preg)%>

のような記述でエラーが出ています。 :cry:

オフライン

#8 2007-05-15 13:21:13

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Geo さんの発言:

<%if(match,REQUEST_URI=/^(/hogehoge/|hoge2|)$/,preg)%>

のような記述でエラーが出ています。 :cry:

この記述だと、正規表現エラーですね。正規表現でのデリミタに『/』を使っていますから、その中で『/』を用いる場合は『¥/』の様にクオートするか、デリミタに別のもの(ここでは、『!』)を用いて

<%if(match,REQUEST_URI=!^(/hogehoge/|/hoge2/)$!,preg)%>

でどうでしょうか。

preg_match はこのように記述にコツがいるので、なるべく早く ereg がちゃんと使えるようにしますね。こういったケースでは、ereg を用いたほうがコードがすっきりすると思います。

オフライン

#9 2007-05-16 10:24:52

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

バージョン 0.2.4 を wiki にアップしました。

ereg / eregi 関連のバグ修正を行いました。これで、

<%if(match,itemid=^(64|128|256)$,ereg)%>
<%if(match,REQUEST_URI=^(/hogehoge/|/hoge2/)$,ereg)%>

などの記述が問題なく使えると思います。

オフライン

#10 2007-05-16 13:10:49

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

>Katsumiさん

Geoです。
バグFixお疲れ様です。ばっちり使えるようになりました。ありがとうございます!! big_smile

<%if(match,REQUEST_URI=^(/hogehoge/hoge2/|/hoge3/)$,ereg)%>

このような記述で
hogehoge/hoge2/
がマッチするようになっていました。これってエスケープ必要ないですか?

また、追加で質問です。

/hogehoge/
こちらのフォルダ以下全てのファイルにマッチさせる事(例えば
/hogehoge/hoge2/
/hogehoge/hoge3/
.....以下多数。のようなパターン)を考えていますが、その場合の記述方法などはありますでしょうか。
catidなどで指定すれば済む場合もあるのですが、もし出来ればそういう記述もありかなと思いましたもので。
正規表現勉強しないとダメですね :oops:

オフライン

#11 2007-05-17 04:33:51

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Geo さんの発言:

ばっちり使えるようになりました。ありがとうございます!! big_smile

<%if(match,REQUEST_URI=^(/hogehoge/hoge2/|/hoge3/)$,ereg)%>

このような記述で
hogehoge/hoge2/
がマッチするようになっていました。これってエスケープ必要ないですか?

このプラグインが実用に耐える様で、よかったです:D。ちなみに、上記の表記だと、http://www.hoge.com/hogehoge/hoge2/ と、http://www.hoge.com/hoge3/ に一致ですね。 ereg を用いる場合は、『/』のエスケープは必要ないです。『. * (  ) [ ] ? + ^ $』などにエスケープが必要だと思います(他にもあるかもしれません)。

Geo さんの発言:

また、追加で質問です。

/hogehoge/
こちらのフォルダ以下全てのファイルにマッチさせる事(例えば
/hogehoge/hoge2/
/hogehoge/hoge3/
.....以下多数。のようなパターン)を考えていますが、その場合の記述方法などはありますでしょうか。
catidなどで指定すれば済む場合もあるのですが、もし出来ればそういう記述もありかなと思いましたもので。

その場合なら、

<%if(match,REQUEST_URI=^(/hogehoge/),ereg)%>

で良いはずです。『(』と『)』は、あってもなくてもかまいません。/hogehoge/ でも、/hogehoge/hoge2/ でも、/hogehoge/hoge3/ でも、/hogehoge/hoge2/hoge4/ でも、/hogehoge/ でも、/hogehoge/hoge.php でも、/hogehoge/hoge.php?hoge=hogehoge でも、先頭が『/hogehoge/』なら何でも一致します。ちなみに、後方一致の場合は、『$』を残して、『^』をはずせばいいです。半ばでワイルドカードを使う場合は、『.*』『.?』『[0-9]*』『[a-zA-Z]*』などですね。

Geo さんの発言:

正規表現勉強しないとダメですね :oops:

ぜひマスターしましょう。 smile

オフライン

#12 2007-05-26 12:41:58

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Katsumi さんの発言:
<%if(match,REQUEST_URI=^(/hogehoge/),ereg)%>

で良いはずです。『(』と『)』は、あってもなくてもかまいません。/hogehoge/ でも、/hogehoge/hoge2/ でも、/hogehoge/hoge3/ でも、/hogehoge/hoge2/hoge4/ でも、/hogehoge/ でも、/hogehoge/hoge.php でも、/hogehoge/hoge.php?hoge=hogehoge でも、先頭が『/hogehoge/』なら何でも一致します。ちなみに、後方一致の場合は、『$』を残して、『^』をはずせばいいです。半ばでワイルドカードを使う場合は、『.*』『.?』『[0-9]*』『[a-zA-Z]*』などですね。

こちらのパターンです

<%if(match,REQUEST_URI=^(/hogehoge/|/hogehoge2/|hogehoge3/),ereg)%>

このようなコードを書き、
/hogehoge/
/hogehoge2/
/hogehoge3/
以下のファイル全てにマッチさせようと思っています。

現状、
/hogehoge/
/hogehoge/item.html
/hogehoge/item2.html
と、アイテムページを訪れている場合は無事に適用されているのですが
ShowBlogsを用い、ページスイッチを使って次のページを表示させると何故かマッチしません。

/hogehoge/    :これはもちろんOK
/hogehoge/item1.html  :これもOK
/hogehoge/page_2.html :ShowBlogsを用い、次の○件を表示させたページ。こちらがなぜかマッチしません!


なーぜだーーーー・・・・・

sad

オフライン

#13 2007-05-26 17:12:53

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

うーん、いま PHP の ereg 関数を調べてみましたが、当然ながら意図したように働き(3つともマッチ)ますね。 ShowBlogs か他のプラグインが、何か影響している可能性があります。
一度、

<%if(match,REQUEST_URI=^(/hogehoge/|/hogehoge2/|hogehoge3/),ereg|data=server)%>

を試していただけますか。『|data=server』の記述を加えると、$_SERVER だけを調べに行くようになります(加えない場合は、$_GET $GLOBAL $_SERVER の順で調べます)。

オフライン

#14 2007-05-26 18:00:46

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

<%if(match,virtualpath=^(/hogehoge/|/hogehoge2/|hogehoge3/),ereg|data=get)%>

でどうでしょう?

オフライン

#15 2007-05-26 18:15:11

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

いまいち成功しませんね。
コードが複雑になってしまっていて、原因がまだ探しきれていないため余裕が出来たときに試してみたいと思います。
なんでだろ :cry:

オフライン

#16 2007-05-29 02:13:34

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

すいません。上記については現在Pendingになっていますが、追加で質問が。

/hogehoge/***/images/item_1.html

このような形で、hogehogeとimagesの中間に属するディレクトリが様々に変化するとき、これについても
NP_matchで解決は可能でしょうか。

<%if(match,REQUEST_URI=^(/hogehoge/[a-zA-Z]\*/images/),ereg)%>

こんな感じかなぁとおもいきや、うまくいきませんでした。実現可能なのだろうか。

オフライン

#17 2007-05-29 06:42:41

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Geo さんの発言:

/hogehoge/***/images/item_1.html

このような形で、hogehogeとimagesの中間に属するディレクトリが様々に変化するとき、これについても
NP_matchで解決は可能でしょうか。

<%if(match,REQUEST_URI=^/hogehoge/[a-zA-Z]+/images/,ereg)%>

もしくは、

<%if(match,REQUEST_URI=^/hogehoge/[^/]+/images/,ereg)%>

でどうでしょうか。上はアルファベットに一致で、下は、『/』以外に一致です。『*』を使うと0文字以上で、『+』を使うと1文字以上です。

オフライン

#18 2007-05-29 07:57:03

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Katsumi さんの発言:
Geo さんの発言:

/hogehoge/***/images/item_1.html

このような形で、hogehogeとimagesの中間に属するディレクトリが様々に変化するとき、これについても
NP_matchで解決は可能でしょうか。

<%if(match,REQUEST_URI=^/hogehoge/[a-zA-Z]+/images/,ereg)%>

もしくは、

<%if(match,REQUEST_URI=^/hogehoge/[^/]+/images/,ereg)%>

でどうでしょうか。上はアルファベットに一致で、下は、『/』以外に一致です。『*』を使うと0文字以上で、『+』を使うと1文字以上です。

>Katsumiさん
おおおお!!いけました!
すばらしいですねNP_match!感動です big_smile

オフライン

#19 2007-05-29 10:48:12

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Geo さんの発言:

>Katsumiさん
おおおお!!いけました!

良かったです。 big_smile   このプラグインが有効のようで、嬉しいです。 yikes

オフライン

#20 2007-05-30 09:03:16

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

こういうプラグインって、需要ありますでしょうか。

仮に、NP_or と命名します。例えば、

<%if(or,[loggedin][category|catid|1])%>
表示されています
<%endif%>

と書くと、ログインしているか、もしくは、カテゴリIDが1の時に、『表示されています』が表示されます。次の表記と、同じ動作です。

<%if(loggedin)%>
表示されています
<%elseif(category,catid,1)%>
表示されています
<%endif%>

同じ動作ですが、NP_or を用いれば、『表示されています』の部分は一度表記するだけで済みます。

同様に、NP_and も簡単に作成出来ます。もし需要がありそうなら、wiki にも上げますけれど(追記: Wiki に上げました)。

旧バージョンのため、コードを削除しました。

デリミタとしては、 『 [ 』 『 | 』 『 ] 』 以外のものも使用可能です(第3引数で指定します)。

オフライン

#21 2007-05-30 09:13:03

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

表示系、やはりイレギュラーなところが発生せざるを得ない、Webの世界ですので、
様々な表記手法があったほうが幅が広がると思っています。

こんな事やりたいんだけど・・・・
というときに、
いやー、それはルール上できません。
ってならなくて済むと思うんですね。

個人的には、欲しい機能です。

オフライン

#22 2007-05-30 09:17:52

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Geo さんの発言:

個人的には、欲しい機能です。

分かりました。 NP_or と、NP_and を整備して、wiki に上げることにします。

オフライン

#23 2007-05-30 09:26:15

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

Katsumi さんの発言:
Geo さんの発言:

個人的には、欲しい機能です。

分かりました。 NP_or と、NP_and を整備して、wiki に上げることにします。

>Katsumiさん
ありがとうございまっす big_smile

オフライン

#24 2007-05-30 11:01:30

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

NP_or と NP_and を、Wiki に上げました

あとは、switch とか、for でしょうけれど、switch は elseif でほとんど同じことが出来るし、for はテンプレートの考え方がこれに相当するので、おそらく要らないでしょうね。

オフライン

#25 2007-05-30 12:09:20

Geo
メンバー
From: 関東
登録日: 2004-07-16
投稿: 87

Re: NP_match, NP_or, NP_and, NP_if(<%if%>構文の拡張)

shizuki さんの発言:
<%if(match,virtualpath=^(/hogehoge/|/hogehoge2/|hogehoge3/),ereg|data=get)%>

でどうでしょう?

>Katsumiさん、Shizukiさん
やはり、ShowBlogsでのページ送り後はいずれの方法をとってもダメでした。
うーむ。。。困った。なぜそこだけ・・・

オフライン

Board footer