正規表現のマッチした前方、後方 - PHPプロ!Q&A掲示板

1067

  • 0P

正規表現のマッチした前方、後方

質問日時 / 2008年3月29日 09:10    回答数 / 2件

Questioner:  goigoiproject  このエントリーをはてなブックマークに追加 

キーワード / 正規表現   

PerlのプログラムをPHPに置き換えています。
以下の点で四苦八苦しています。助言よろしくお願いいたします。

●global、local変数の取り扱いです。
Perlでは sub 内でglobalの指定をしなくてもglobal変数を扱えますが、PHPでは明示しなくてはいけません。どれだけ明示しなくてはならないか・・・
これはどうしょうもないのでしょうね?

●正規表現のマッチした前方、後方はPerlでは変数$`,$'で取得できるのですがPHPではどうして取得するのでしょう?
取得するためにプログラムしなければならないのでしょうか?

以上アドバイスよろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01Kanonbell>Perlでは sub 内でglobalの指定をしなくてもglobal変
 ┗A01-1kaitauこんばんは。 後半の正規表現のところだけ・・・

回答一覧

並び替え:

A01 参考になった
answererKanonbell [3月30日 12:27]

>Perlでは sub 内でglobalの指定をしなくてもglobal変数を扱えますが

まあ、関数内で必要とするものは引数で渡すべきだと思うので、globalで何個も宣言が必要になる
こと自体がおかしい、という気はします。
引数の数がかなり多いのでそういう形になってしまっているのだとは思いますけれど。

まあ、とにかくグローバル変数を関数内で使いたいなら、globalするしかないですね。

>正規表現のマッチした前方、後方
正規表現はあまり自信のない分野なので何ですが、そういう修飾子(になるのかな)はないような。
自分で実装するならpreg_splitあたりが少ないコードですみそうではあります。
http://jp2.php.net/manual/ja/function.preg-split.php

が、
>正規表現の威力を必要としないのなら、より高速な (機能はシンプルですが) 
>代替関数として explode() あるいは str_split()  のような選択肢があります。
とあるのでこちらを使った方がいいようですね。
実際にはmb_splitなどのマルチバイトのものを使った方がいいと思いますけれど。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerkaitau [3月31日 22:34] (最終編集:3月31日 22:35)

こんばんは。

後半の正規表現のところだけ・・・

とりあえず、PHPの関数には代替手段は用意されていないので、自作するしか無いわけですが、
preg_splitはperlのsplitの互換でしかないので、$'などの代替手段としてはちときついと思います。

それよりは、preg_matchのflagにPREG_OFFSET_CAPTUREを指定して
なんとか工夫するほうが、移植の仕方としては労力が少ないかなぁ、と思います。

PREG_OFFSET_CAPTUREを使用した参考例:
  1. <?php
  2.  
  3. $urls[] = 'http://www.phppro.jp/qa/1067';
  4. $urls[] = 'http://www.phppro.jp/school/linux/vol7/1';
  5. $urls[] = 'http://www.itmedia.co.jp/news/articles/0803/31/news080.html';
  6.  
  7. foreach( $urls as $url ) {
  8.   if( preg_match('/(?<=phppro.jp)\/(.*?)\//',$url,$matched,PREG_OFFSET_CAPTURE) ) {
  9.     echo "'$url' MATCHED. \n";
  10.     echo "  \$& -- " . $matched[0][0];
  11.     echo "\n";
  12.     echo "  \$` -- " . substr($url,0,$matched[0][1]);
  13.     echo "\n";
  14.     echo "  \$' -- " . substr($url,$matched[0][1]+strlen($matched[0][0]));
  15.     echo "\n";
  16.     echo "  \$1 -- " . $matched[1][0];
  17.     echo "\n";
  18.   } else {
  19.     echo "'$url' NO matched. \n";
  20.   }
  21. }
  22.  
  23. ?>

out:

  1. 'http://www.phppro.jp/qa/1067' MATCHED.
  2.   $& -- /qa/
  3.   $` -- http://www.phppro.jp
  4.   $' -- 1067
  5.   $1 -- qa
  6. 'http://www.phppro.jp/school/linux/vol7/1' MATCHED.
  7.   $& -- /school/
  8.   $` -- http://www.phppro.jp
  9.   $' -- linux/vol7/1
  10.   $1 -- school
  11. 'http://www.itmedia.co.jp/news/articles/0803/31/news080.html' NO matched.

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)