正規表現道場at PHP
正規表現道場 - 暇つぶし2ch2:nobodyさん
07/01/11 03:10:51
スレリンク(tech板)

終了

3:1
07/01/15 00:57:08 /DToo9Jn
勝手に終了すんなデブ
ここはここでやればいい
再開あげ

4:nobodyさん
07/01/15 20:06:50
>>2は道場破り?

5:nobodyさん
07/01/15 22:01:26
一年ぶりの復活をしたなら過去スレくらい書こうぜ('A`)

過去スレ
正規表現道場@2ch
 スレリンク(php板)
正規表現道場@2ch Part2
 スレリンク(php板)
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
 スレリンク(php板)
正規表現道場@2ch Part4
 スレリンク(php板)


過去スレのテンプレにあった参考サイトたち
Perlメモ
 URLリンク(www.din.or.jp)
正規表現メモ
 URLリンク(www.kt.rim.or.jp)
Regex::Diagram.pm
 URLリンク(www.cc.rim.or.jp)
正規表現
 URLリンク(www.cc.rim.or.jp)
UNIX正規表現入門
 URLリンク(web.archive.org)
Regular Expression(Riue ちゃんの正規表現講座)
 URLリンク(www.sixnine.net)

ほとんどは↓のリンク集にまとまっています。
正規表現/文字コード最新リンク2005
 URLリンク(www2.famille.ne.jp)

6:nobodyさん
07/01/16 02:57:15
>>5
ご苦労様です

7:()と(?:)の違い
07/01/21 14:23:29 HARdTCVv
対象文字列 //abca
正規表現 ^(/([a-z]*))*$ → マッチ
正規表現 ^(/(?:[a-z]*))*$ → マッチしない

後方参照を許す括弧かそうでないかで結果が違うのはなぜでしょうか?
処理系は PHP 5.2.0-8、OS は Debian GNU/Linux etch
使用した関数は preg_match() です。

具体的には
preg_match('"^(/(?:[a-z]*))*$"', "//abca", &$m);
var_dump($m);
とすると $m[0] が空文字列になります。
すなわちマッチしません。

8:nobodyさん
07/01/21 15:16:09
>>7
preg_matchに与える正規表現は/で括る必要があるけど、原因はそれじゃない?
正規表現reをpreg_matchに与えるときは
preg_match("/re/", $baka);
とかやるんだけども。

9:()と(?:)の違い
07/01/21 15:25:20 HARdTCVv
>>8
いちおう '@^(/(?:[a-z]*))*$@' などとして区切り文字を
@ にするなど気をつけているのですが・・・
()と(?:)により挙動が違うというのが解せません・・・
もう少し実験してみます。ereg 系で試すとまた
結果が違ってくるかも知れないので。

10:nobodyさん
07/01/21 20:27:33
これは…PCREのバグを踏んじゃった可能性が結構高そうな…
echo preg_match('{^(?:/(?:[a-z]*))*$}', "//abca");
=> 0

Perl互換正規表現と言うくらいなのでPerlとの比較をしてみても勿論このとおり
$ perl -e 'print scalar "//abca" =~ m{^(?:/(?:[a-z]*))*$};'
=> 1

後で念のためPCRE直接叩いてみよう

11:()と(?:)の違い
07/01/21 21:20:40 HARdTCVv
>>10
ふぅむ、バグの可能性もあるんですか~
//abca じゃなくて /abca/abca とかならマッチするんですよね。
実はパスをディレクトリに分解しようとおもいまして、
その途中に // が入っているようなケースで挙動がおかしいので調べてました。
//abcde は / と /abcde に分解したかったんです。

12:10
07/01/21 23:05:47
ふう、PCRE付属のpcretestでバージョン別検証。
[PCRE version 6.6 06-Feb-2006]
re> /^(?:a(?:b*))*$/
data> aa
0: aa

[PCRE version 6.7 04-Jul-2006]
re> /^(?:a(?:b*))*$/
data> aa
No match

[PCRE version 7.0 18-Dec-2006]
re> /^(?:a(?:b*))*$/
data> aa
0: aa

ver6.7のみ上手くマッチしないと言う結果になった。
changelogの7.0をみてもそれっぽいのが見つけられないけれど、38辺りかなぁ…

ちなみにPHPで使ってるPCREのバージョンは、
phpinfoのpcreのPCRE Library Versionで確認できる

13:nobodyさん
07/01/22 00:49:01
ちょっといいかな。
>>12 の結果に疑問はないのだけど、

>>7
> preg_match('"^(/(?:[a-z]*))*$"', "//abca", &$m);
は空文字列にマッチで正解じゃないの?
だって、対象文字列には // と行頭に二つスラッシュが並んでいるけど、
正規表現は ^/ と一個しかないよ?

後ろに $ が置かれちゃってるから、
//hogehoge というパターンには空以外マッチしようがないと思うんだけど
俺、何か勘違いしてる?


14:nobodyさん
07/01/22 01:56:13
>>13
多分、中のアルファベットに対する量指定子を考慮に入れてないんでないかい?
^ # 文字列の最初
 (
  /(?:[a-z]*) # /の後に[a-z]が0文字以上
 )*       # の0回以上繰り返し
$ # 文字列(行)の最後

//abcaは、<スラッシュ、[a-z]が"0文字"、スラッシュ、[a-z]が4文字>となってマッチしなければならない。はず。

>>11
その目的だとpreg_matchじゃ駄目だと思う。
一個目のキャプチャが繰り返しを全て記録することを期待したんだと思うが、毎回上書きされてしまう。
パス文字列が妥当なものかをマッチングで検証するためにpreg_matchを用いて、
実際の切り分けはexplode等を使ったほうがいいんじゃないかな。スレ違いになるが。
マッチングで切り分けるとするならpreg_match_allを用いて
preg_match_all('{\G/[a-z]*}', "//abca", $m)
といった感じか

15:()と(?:)の違い
07/01/22 04:08:40
>>12
ビンゴのようです。
手元の二つのLinuxマシンで試してみました。

preg_match('"^(/(?:[a-z]*))*$"', "//abca", &$m);

Debian GNU/Linux etch
PHP 5.2.0-8 PCRE 6.7 04-Jul-2006
マッチしない。

Fedora Core 4
PHP 5.1.6 PCRE 6.3 15-Aug-2005
マッチする。

16:()と(?:)の違い
07/01/22 07:00:19
>>12
TurboLinux Server 8.0 (Viper) での挙動も調べてみました。

preg_match('"^(/(?:[a-z]*))*$"', "//abca", &$m);
preg_match('"^(/(?:[a-z]*))*$"', "/a/abca", &$m);
いずれもマッチします。
PHP 4.2.3 PCRE 3.4 22-Aug-2000 です。

やはり Debian GNU/Linux etch の PHP5 5.2.0-8 だけが
PCRE 6.7 04-Jul-2006 を使っていて挙動が変みたいなんで、
Debian GNU/Linux の BTS (バグ報告)に挙げようとおもうんですが、
>>12 の結果も引用させてもらって構いませんでしょうか?

17:13
07/01/22 11:21:28
>>14
ありがとう。指摘通り誤読していた。
拡張表記をみてわかったよ。

やっぱLarryは偉いな。

ところでかっこの内と外で繰り返し指定が
連続するパターンは組み合わせの爆発が
怖くて自分はできるなら使わないように
しているんだけど、みんなはそんなこと
気にしない?


18:()と(?:)の違い
07/01/22 12:31:13
>>17
DFAだからとりあえずえらいことにならないうちに停止するだろう、
とか自分では思い込んでるんですが、NFAなら延々とバックトラック
しながらはまり込むとかあるんですかね。

19:10
07/01/22 21:04:29
>>16
どうぞお使いください。
でも、phpのソースにpcreが同梱されてるようだけれど報告先ディストリでいいのかな…

20:()と(?:)の違い
07/01/22 21:51:33
>>19
ありがとうございます。
むしろ PHP のバージョンごとあげてもらえればと。
って、最新バージョンのソースに入ってるのか orz
ちょっと PHP のソース眺めながら思案してみます。

21:20
07/01/23 00:05:58
>>19
I've reported this issue to PHP bug report.
URLリンク(bugs.php.net)
Complete report and examination results are in
URLリンク(geeklog.windy.cx)
I'm in my Linux box without Japanese environment :-p

22:20
07/01/23 07:47:35
Nuno Lopes さんからリプライがあり、修正対象となりました。

[22 Jan 9:43pm UTC] nlopess@php.net
I confirm this is a bug in pcre. so let's ask Andrei to
upgrade PCRE to version 7, maybe for PHP 5.2.2
(assign back to me if you want me to do it).

23:nobodyさん
07/01/23 17:36:48
>>21-22
これは模範としたいバグ報告。乙です。

24:nobodyさん
07/01/23 21:15:28 EGIjqz4P
perl質問厨よろしくです。
@array = split(/(hoge(.))\2/, $line);
この2番目の括弧だけ@arrayに含めないことはできますか?
'----hoge11-----'

('----', 'hoge1', '-----')
という風に取り出したいのです。


25:nobodyさん
07/01/23 22:31:38
すいません。別の方法で解決しました。

26:nobodyさん
07/02/01 17:35:44
スレリンク(tech板)

終了

27:20
07/02/14 08:22:19
[9 Feb 7:58pm UTC] nlopess@php.net
bundled pcre upgrade to version 7.0.

28:nobodyさん
07/02/17 11:34:20
PHPで正規表現
URLリンク(www.pahoo.org)


29:nobodyさん
07/02/18 02:46:46
マルチで宣伝か?


30:nobodyさん
07/02/20 02:12:09
質問よろしくお願いします

ABCと続く場合を除くABという文字列を指定したい場合は
どのように書いたらよいでしょうか・・・

31:nobodyさん
07/02/20 02:21:35
正規表現ってどんなメリットあるの?
覚えなくても良いんでしょ?
よく、書く行数が減る⇒デバッグの時に楽って言うけど、
ロジック設計を完璧にするほうが大事じゃないかなーなどと思ってしまいます(ドシロウトですが)
そんなのとうに完璧って人がチャレンジすることなんですかねー

32:nobodyさん
07/02/20 02:23:50
>>30
Rubyでは(おそらくPerlやPHPのpreg_*系でも)
AB(?!C)


33:nobodyさん
07/02/20 02:26:48
>>31
文字列のパターンを記述するために特化した言語なので、
覚えれば非常に楽ができる。
ロジックで100行とか費やすようなパターンを、
正規表現では1行で表すことも可能(かもしれない)。

覚えなくてもいいが、覚えた方がはるかに楽ができるよ。

34:nobodyさん
07/02/20 07:20:03
>>31
ロジック組めないやつが楽をするためだよ
文字列から数字の部分だけ抜き出して表示とか正規表現なら簡単に出来るが
使わないでやれとかいわれたら時間がかかる。おまけにバグる。


35:nobodyさん
07/02/20 08:24:42
数字だけ抜き出すのが何かものすごい魔法のような技術のように思っているらしいw

36:nobodyさん
07/02/20 08:27:41
あるいは「おれってすげえ気の利いたこと言った?」とか思ってるのかなwww

37:nobodyさん
07/02/20 08:35:59
【心の】旦那には絶対言えない過去4【奥に】既婚女性板
スレリンク(ms板)

7 名前:可愛い奥様[] 投稿日:2007/01/18(木) 03:03:54 ID:iE8GVdnP
援交10回、中絶2回、デリヘル、ソープ1年、整形2か所

12 名前:可愛い奥様[] 投稿日:2007/01/19(金) 22:43:01 ID:s7dkuHKN0
高校生の頃から喫煙。不倫経験あり。
旦那は私にとって7人目の彼氏。(旦那には3人目と嘘ついた)
酒に酔った勢いでワンナイトラブの経験あり。

25 名前:可愛い奥様[] 投稿日:2007/01/26(金) 04:08:25 ID:IfNo5kNWO
中絶4回、イメクラ一年、二重整形、大学中退、性病2回、同棲3回。

45 名前:可愛い奥様[sage] 投稿日:2007/02/04(日) 14:24:40 ID:PBhJa6V+0
自分の預金が旦那の年収の7倍くらいあること。
学生のとき、ちょっとした事業起こして大成功w そのことも話してない。

47 名前:可愛い奥様[] 投稿日:2007/02/04(日) 17:16:59 ID:CaAW9Ko50
うーん。堕胎。母子手帳に記載しないといけないから…そこは糊で貼付けた。
義母にはバレているだろう。でも回数が…1回多いとは…永遠の秘密。

92 名前:可愛い奥様[] 投稿日:2007/02/09(金) 23:46:04 ID:QRXcETQYO
セクキャバでバイト経験あり。援交しまくり時代もあり。ヤッた数は100人くらい。
私バツイチで今の旦那には元夫の浮気が原因で離婚したの。とか言ったけどほんとは逆。
好きな人できて夫捨ててのりかえた。浮気しまくりだった。
すごくいい夫だったのにすごく最低な事したって思う。

106 名前:可愛い奥様[] 投稿日:2007/02/18(日) 09:56:13 ID:wIf/65Md0
半年前、万引きして捕まった事。嘘泣きして逃がしてもらった(^^v

38:nobodyさん
07/02/20 19:16:13 W7lgDSO2
/tatakanamk/
と言う文字列があって/から/までの検出をするにはどう書けばよいでしょうか?
/と/も含めて12文字を検出したいのです。
超初歩的ですがよろしくお願いします。

39:nobodyさん
07/02/20 19:38:28
>>1
>使用言語を書くのを忘れずに。

くらいは守ってくれ。処理系によって正規表現は千差万別だからな。

40:nobodyさん
07/02/20 19:56:10
エスパー見習いの漏れが使用言語は Perl と推測。
バックスラッシュを前置してエスケープする。
/\/tatakanamk\//

41:nobodyさん
07/02/20 22:52:27
>>32
ありがとうございました!

42:nobodyさん
07/02/21 02:10:45
>>40
m{/tatakanamk/} みたいにやたらとエスケープ連発しないですむ方法を教えろよ… 


43:nobodyさん
07/02/21 03:35:33
エスケープを知らないのも問題だから両方教えるべきだとおも

44:40
07/02/21 10:00:30
だってもし他の言語だったとしても応用が一番効きそうじゃん。

と言い訳。

45:42
07/02/22 01:40:37
>>43
そりゃ確かにそうだね。
必要のないところまでエスケープしているような正規表現見てると
腹が立ってくるんだよw

>>44
わかった、わかったw


46:nobodyさん
07/03/02 01:04:13
保守

47:nobodyさん
07/03/10 16:03:45 VXyj5Dh3
<?
$str = "/get/data/&country=2&url=URLリンク(www.example.com)

このデータの中ではじめの url= 以降の文字列を取得するにはどうすればいいのでしょうか?ちなみにurl=以降の文字列にも再度url=が含まれていますが、これを無視してすべて取得したいです。

どうぞよろしくお願いします。

48:nobodyさん
07/03/11 04:44:19
>>47

url=URLリンク(www.example.com)
がとれりゃあいいのか?

url=.*$

で何か不都合ある?


49:nobodyさん
07/03/12 12:20:51 DmSqMrCU
php使ってます。
文字列中の?を抽出するにはどう記述したらいいのでしょう?

¥?

じゃだめなことはわかりましたorz

50:nobodyさん
07/03/12 12:48:47
バックスラッシュを前に置く。

51:nobodyさん
07/03/12 14:27:04 DmSqMrCU
ばっちですた!

52:nobodyさん
07/03/18 21:25:07 7HFdTRo7
教えてください。

$in=ユーザーからの入力
$str='abc%ghi';
$str=preg_replace('/(\w+)%(\w+)/',"\1$in\2",$str);

ユーザーからの入力を'def'にしておくと、abcdefghiになります。
ですがユーザーからの入力が'123'の場合、ghiになります。
たぶん、置換後の文字列が「\1123\2」と、繋がって解釈されているからだと思います。
{\1}のように囲むとか、なにか繋がらないように解釈してもらう方法はないですか?

二段階に分けて置換するとかすれば回避できなくはないですがスマートではなさそうなので。

53:52
07/03/18 21:25:46
すいませんphp4です。

54:nobodyさん
07/03/18 22:00:48
こうしたらこうなるって結果を一行にまとめて

55:nobodyさん
07/03/19 08:43:07
>>52
"\\1" . $in . "\\2"
"\\1{$in}\\2"

というか普通に\\1と\1を間違えてるだけじゃない?

56:52
07/03/20 00:34:39
>55
>普通に\\1と\1を
すいません間違いでした。(ここに貼ったあと直しましたが動作変わらず。)
そのうえ↓を書いてて解決しました。手間取らせてすいません。


$in='123';
$str=preg_replace('/(abc)%(def)/',"\\1$in\\2",$str); //これが
$str=preg_replace('/(abc)%(def)/',"\\1123\\2",$str); //こうなってしまうので
$str=preg_replace('/(abc)%(def)/',"def",$str); //\\1123はないので消えて\\2だけ置換され
print $str; //defが出力される

と思うので、{$in}でくくっても結果は同じでした。
一番いいのは\\1側を{\\1}くくる方法だと思うのですが。


→phpだと\\1は\$1でもいいので、"\${1}$in\$2"で解決しますた。ほんとすいません。

57:nobodyさん
07/03/23 00:39:31 P+rVOV8A
$str = "foo@=barfoo@=bar";
$str = preg_replace('/foo.*(=)bar/', "a\\1b", $str);
を実行した場合の結果をa=ba=bにしたいのですが、
実際はa=bになってしまいます。
どこが間違っているのでしょうか?

58:nobodyさん
07/03/23 02:15:09
>>57

.* が何にマッチしているのか確かめてみ。


59:57
07/03/23 10:16:39 P+rVOV8A
>>58
.*を bar と続く文字列以外の任意の文字列に変えればいいというのはわかるのですが、
$str = preg_replace('/foo[^(bar)]*(=)bar/', "a\\2b", $str);
としてもうまくいきません。
エロイ人よろしくお願いします。

60:nobodyさん
07/03/23 10:45:01
「ある文字列を含まない文字列」の正規表現はめんどいので最短マッチ .*? で。

61:57
07/03/23 16:57:03
>>60
おお!それでできました。
ありがとうございます。

62:nobodyさん
07/03/24 01:11:05
>>59

foo[^(bar)]*(=)bar

ブラケットの中とかどこでこんな書き方覚えてくるんだよ…
今回の場合、barまで見ないでも = までみりゃあいいんじゃないの?
不用意に最短マッチ使ってるとパフォーマンスで泣くよ?

foo[^=]*=bar を a=b に置換でいいじゃん。
=をキャプチャするのも意図がわからん。


63:nobodyさん
07/03/24 12:15:47 yU007f6l
<html>
<head>
<title>テスト</title>
</head>
<body>
<!-- ここから -->
あああああああああああ<br />
あああああああああああ<br />
あああああああああああ<br />
あああああああああああ<br />
あああああああああああ
<!-- ここまで -->
</body>
</html>

このようなhtmlをPHP5のfile_get_contentsで読み込んで
<!-- ここから -->~<!-- ここまで -->を取得したいのですが
どうすれば良いですか?

"/<!-- ここから -->(.*)<!-- ここまで -->/"
で読めませんでした

64:nobodyさん
07/03/24 13:41:28
>>62
> 不用意に最短マッチ使ってるとパフォーマンスで泣くよ?

kwsk

65:nobodyさん
07/03/24 16:11:22
$text = file_get_contents(なんちゃらかんちゃら);
mb_ereg("<!-- ここから -->(.*)<!-- ここまで -->", $text, $data);
echo $data[1];

改行に邪魔されてるんだろう

66:nobodyさん
07/03/25 02:07:05
>>65
その記述だとパターンの部分でエラーがでない?

67:nobodyさん
07/04/07 00:58:14 YCq54Nw2
始めまして。
C#で、正規表現でyyyy/mm/dd書式をどう表現するのでしょうか?
ちなみに、.NETの正規表現はPerl互換だそうです。

68:nobodyさん
07/04/07 04:03:00
>>67
Datteクラスかなんかに文字列食わせて、例外飛ぶかどうかで
判定したら?

正規表現でやると 9999年13月35日をうけつけてもいいってのなら
  \d{4}/\d{2}/\d{2}
かな。
月と日は頑張ればなんとかできるけどめんどくさいからやらない。



69:nobodyさん
07/04/08 02:12:40 EVMLEL7f
>>68
ありがとうございます。
実は、正規表現Validatorを使っているのです。

70:nobodyさん
07/04/08 16:37:48
>>68
ああ、そういうことなのね。

一応注意しておくけど、C#の文字列のエスケープも\を使うので
プログラムに書くときは
  "\\d{4}..."
のように\を重ねるか、
  @"\d{4}.."
のような\が特別扱いされない形式にしてね。


71:nobodyさん
07/04/15 02:12:22 v7Ys668x
php5です。ファイルのフルパスをディレクトリ,ファイル名,拡張子に分割してその配列を返したくてこう書きました。

$pattern1 = '`^(.*)(?:[/\\\](.*)){1}$`';
preg_match($pattern1, $fullpath, $match1);
$pos = strpos($match1[2], '.');
if($pos === false){
return array($match1[1], $match1[2]);
}else{
$pattern2='`^(.*?)\.(.*)$`';
preg_match($pattern2, $match1[2], $match2);
return array($match1[1], $match2[1], $match2[2]);
}

必ず拡張子があるなら一度のpreg_matchでキャプチャ出来たのですが
拡張子無しファイル混じりだった場合の正規表現がうまく思いつかずに二段階(三段階?)になってしまいました
でもpreg_matchやってその中で'.'探して、あったらさらにpreg_matchというのはまわりくどいように思います

この処理を一度にこなす正規表現の考え方のヒントをください

72:nobodyさん
07/04/15 02:14:51
ああ半角空白の連続ダメなんだっけ インデント消えちゃた

73:nobodyさん
07/04/15 03:03:32
>>71
URLリンク(jp.php.net)
及び関連項目を参照。

74:73
07/04/15 03:04:35
あ、ごめん。正規表現スレだったね。無視して。

75:73
07/04/15 03:10:35
で、考えてみたんだけど、

$path = '/abc/def.g/eee.txt';
preg_match('/(.*?)¥/([^¥/]*)¥.([^¥/.]*$)/', $path, $match);
print_r($match);

こんな感じでどう?


76:73
07/04/15 03:17:28
これじゃ拡張子のない場合に対応できないか。
/(.*?)¥/([^¥/]*?)(¥.[^¥/.]*)?$/
でどうかな。スレを汚してしまってすまん。

77:nobodyさん
07/04/15 09:05:07
PHPなら、dirnameとbasenameつかえば正規表現なんか使う必要一切ないだろ

78:nobodyさん
07/04/15 11:13:03
>>77
>>73-74

79:71
07/04/15 11:28:41
正規表現無しだとこんな感じでした

$p = pathinfo($fullpath);
$temp = explode('.',$p['basename'],2);
$p['name'] = $temp[0];
if(isset($temp[1])){
 $p['ext'] = $temp[1];
}

>>76を参考にして正規表現で書けました

$pattern = '`^(.*)[/\\\]([^.]*?)(?:\.(.*))?$`';
preg_match($pattern, $fullpath, $match);

ありがとうございました

80:nobodyさん
07/05/03 19:11:49 meD6A7ah
phpで携帯電話の絵文字を取り除くようpreg_replaceを使っているのですが、
絵文字が複数含まれた文字列?などでうまく取り除けません。
こんな感じにしているのですが原因やおかしな点などご教示ください。お願いします。

$str = '絵文字が含まれる文字列';
$emojiSjisChars = '(?:[\x00-\x7F\xA1-\xDF]|(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]))';

#DoCoMoの場合
$str = preg_replace('/\G(' .$emojiSjisChars. '*?)(?:\xF8[\x9F-\xFC]|\xF9[\x40-\x49\x50-\x52\x55-\x57\x5B-\x5E\x72-\x7E\x80-\xB0])|(?:\xF9[\xB1-\xFC])/', '$1', $str);

#AUの場合
$str = preg_replace('/\G(' .$emojiSjisChars. '*?)(?:[\xf3\xf6\xf7][\x40-\xfc]|\xf4[\x40-\x8d])/', '$1', $str);

#Softbankの場合
$str = preg_replace('/\G(' .$emojiSjisChars. '*?)\x1B\x24[E-G].*?\x0F/', '$1', $str);

81:80
07/05/03 19:17:55 meD6A7ah
すいません。↑の$emojiSjisCharsは$sjisCharsの命名間違えです。

82:nobodyさん
07/05/03 19:26:15
ちゃんと読んでないけど
(?:絵文字のコード) な部分を (?:絵文字のコード)+ にするだけではないの?

83:80
07/05/03 20:24:41 meD6A7ah
>>82
レスありがとうございます。
下のように+を入れましたがダメでした。
色々考えているとどんどん分からなくなってきました...
おかしな点があれば引き続きご教示お願いします。

#DoCoMoの場合 ※見にくいので表示上改行します。
$str = preg_replace(
  '/\G(' .$emojiSjisChars.'*?)
    (?:\xF8[\x9F-\xFC]|\xF9[\x40-\x49\x50-\x52\x55-\x57\x5B-\x5E\x72-\x7E\x80-\xB0])+|
    (?:\xF9[\xB1-\xFC])+/', '$1', $str);

84:nobodyさん
07/05/04 00:29:52
オライリーの詳細正規表現の本って
通常のと第2版ってのがあるけどどっちがいいのよ?

85:nobodyさん
07/05/04 03:16:56
>>84
通常のって初版のことかい?
そりゃあ新しい方が。

具体的にどう変わったか覚えてないのでオライリーのサイトを見たけど、
Perlの対象が5.8にあがっているのと、.JAVAとNETの説明が増えたとからしい。


86:nobodyさん
07/05/10 19:57:43
php4.3.11です
---------------------------------
$str = <<< DOC_END
あああああ
いいいいい
<html_start>
ううううう
えええええ
<html_end>
おおおおお
DOC_END;

$pattern = "/<html_start>(.*)<html_end>/";
$replacement = 'aaaabbbb';

$res = preg_replace($pattern, $replacement, $str);
print_r($res);
---------------------------------
と出力してみましたが何も表示されませんでした。
ホントは「あああああいいいいいaaaabbbbおおおおお」と出て欲しかったのですが…。
最終的には<html_start><html_end>で囲まれた範囲に
PHPのhtmlspecialchars()やnl2br()関数を適用して出力したいです。

87:nobodyさん
07/05/10 20:35:51
>>86
> $pattern = "/<html_start>(.*)<html_end>/";

「 ^ や $ があるってことは正規表現って行単位?複数行の場合は?」とか思いながら

$pattern = "/<html_start>(.*)<html_end>/s";

にして試す。で、「s って何だよ、こんにゃろ」と思いながらマニュアルの「パターン修飾子」のとこを読む。

うちのPHP5さんでは元のコードでも「何も表示されない」にはならなかったな。
 
ブラウザ出力: あああああいいいいい うううううえええええ おおおおお
ソース: print_r($str) な感じ

88:nobodyさん
07/05/10 20:51:04
>>87
s修飾子で動作しました!ありがとうございます。

>「s って何だよ、こんにゃろ」と思いながらマニュアルの「パターン修飾子」のとこを読む。
関数のページばかりみて
URLリンク(jp.php.net)
URLリンク(jp.php.net)
のページの存在に気がつきませんでした…。

あとは関数を適用する方法を探してみますっ!

89:nobodyさん
07/05/10 21:18:19
案外この手の質問したい人もいるんだね

90:86
07/05/14 15:45:03
後方置換する時に関数かましたくマニュアル眺めてたら「e修飾子」をみつけたのですが
>>87の「S修飾子」と同時に使おうと
$pattern = "/(.*?)<html_start>(.*)<html_end>(.*?)/se";
$replacement = "'\\2''\\1''\\3'";

こんなコードを書いてみた所
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
Failed evaluating code:
といった感じで怒られます
修飾子2個は同時に使えないのでしょうか…?

91:86
07/05/14 17:55:10
>>86ですが
自分で見返してたらこれは既に正規表現でなくPHPの質問な気がしてきましたので該当スレに
移動しますです。
スレ違、申し訳ありませんでした。

92:nobodyさん
07/05/17 13:08:20
IPを正規表現でチェックしたいのですが
210.000.111.1~210.000.111.255
215.100.000.1~215.100.000.255
の2つに当てはまる場合、TRUE(int1)をかえすにはどうすればいいでしょうか?
以下のようにやってみたのですが他のIPでもint(1)がかえってきます。

preg_match('/^210\.000\.111\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ || ^215\.100\.000\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $_SERVER['REMOTE_ADDR'])


93:nobodyさん
07/05/17 13:53:20
>>92
正規表現で foo || bar みたいなのはないっしょ。
/^(210...(中略)...|215...(中略)...)$/ みたいな。

アドレスの範囲のチェックをするなら正規表現使わない方が良いと思うけどね。

94:おながいします
07/06/06 13:28:10 iKhV2zih
すみませんが、価格にマッチする正規表現を教えていただけないでしょうか。


\1,000,000,000
\12,345
\1,230
\200
\10


数字3つごとに、カンマが入り、先頭に円マーク(\)のくるものです。

判らないためググッたのですが、正規表現に関する本ばかり検索結果として出てきまして…。

95:おながいします
07/06/06 13:29:35 iKhV2zih
上の>>94ですが、使用言語はPHPです。

96:nobodyさん
07/06/06 13:41:59
それは、「\12,1232,32」みたいなのははじきたいの?

97:nobodyさん
07/06/06 13:49:54
「正規表現 カンマ」とかでぐぐってみると・・・

98:nobodyさん
07/06/06 14:54:17
>>98
穴だらけだけどこんなんのこと?
$hoge = "\1,000";
if(ereg(".*[0-9,\\]",$hoge)):
echo "ok";
else:
echo "ng";
endif;

99:nobodyさん
07/06/06 15:08:26
>>98
つ[ URLリンク(www.google.co.jp) ]

100:94
07/06/06 17:22:28
>>96 >>97 >>98 >>99
皆様、ありがとう御座いました。
「価格 正規表現」、「値段 正規表現」でググってました(汗)

101:nobodyさん
07/06/30 13:42:20
(?:pattern),および(?>=pattern)が認識されないエディタにおいて、
$obj->method();の「method」のみにマッチさせるにはどうすればいいでしょうか。
ちなみに(?=pattern)は使えます。


102:nobodyさん
07/07/09 23:51:58 jN4+J6ks
VB.NETで正規表現を書いています。
条件としては、「A0123」のように、先頭がアルファベットのAでその他が数字4桁という正規表現と、
「01234」のような数字5桁という二種類のどちらかにマッチする正規表現を作っています。
正規表現は苦手で困っています。
どなたかご教授下さい。
よろしくお願いします。

103:nobodyさん
07/07/10 01:52:51
>>012
[A\d]\d{4}

とか。
あと「教示」な。


104:nobodyさん
07/07/13 17:31:53 lsKPRG81
phpで文中の郵便番号の部分を置き換える正規表現を書いているのですが
電話番号(携帯など)も引っかかってしまいます
どのように直せばいいのでしょうか?

mb_ereg_replace('([0-90-9]{3}[\--ー‐]+[0-90-9]{4}|[0-90-9]{7})',"郵便番号",$data)

105:nobodyさん
07/07/14 04:11:15
mb_ereg って戻り読み使えなかったんだっけ?

(\D)\d{3}-\d{4}(\d{3})?(?!\D) を \1郵便番号 で置換。でどう?
面倒くさいので全角数字とかハイフンの類は自分で調整して。


106:nobodyさん
07/07/20 05:15:36 wp5plGkY
$textにHTMLタグを含んだ文字列が入っていて、
<>外部の< > " をそれぞれ < > " に置換したい(<>内部はそのまま)
のです。以下のように、まず全ての<>"を置換し、HTMLタグの<>だけを
元に戻してみましたが、うまくいきません。どなたかご教授願います。
言語はあとでPHPでも同様のものを作成する予定ですが、今はPerlです。

$text = "tt\"tt<3bbb\nst<a gg&tg;gg href=\"aaa\">bbb<\n";

print "before=\n";
print $text."\n\n";

$text =~ s/</</g; $text =~ s/>/>/g; $text =~ s/\"/"/g;

$text =~ s/<([^(>)]*)>/<$1>/g;

while ($text =~ /<([^>]*)\"\;([^>]*)>/) {
$text =~ s/<([^>]*)\"\;([^>]*)>/<$1\"$2>/g;
}

print "after=\n";
print $text."\n";

↓このように置換されることを想定しています。
tt"tt<3bbb
st<a gg&tg;gg href="aaa">bbb<


107:nobodyさん
07/07/20 05:26:31
久しぶりに実体参照の地雷を踏みまくってる投稿を見た。

108:106
07/07/20 05:38:28 wp5plGkY
「このように置換されることを想定しています。 」の部分で
実体参照の部分がそのまま表示されてしまったので全角で修正します。
よろしくお願いします。

tt&quot;tt&lt;3bbb
st<a gg&tg;gg href="aaa">bbb&lt;


109:nobodyさん
07/07/20 08:47:21
何がやりたいのかさっぱりだ。
どこまでがタグか解析してタグ以外のタグ文字を実体参照化したいということ?
それ元のテキストを生成してる時点で何か間違ってるだろ

110:nobodyさん
07/07/20 12:57:58
何かの内側と外側を判定するのは結構面倒だよなぁ。こないだ<a ~>から</a>までの
間だけを操作しようと3分考えて、ネストがありえることに気付いて挫折した。

111:nobodyさん
07/07/20 13:08:08
って>>106読んでなかった。>>109に同感。
それじゃあどこからどこまで切れば良いのかわからない。

xxx<abcd<ddeg<eee<g<fhg>degh><qq>zzz

の時、何が保証されていて、どこからどこまでをタグと見なせばいいの。

112:106
07/07/21 01:21:27 VYWED9XA
ごめんなさい。説明が足りませんでした。
掲示板で投稿された書き込みに対して、上記のような処理をしたいと考えています。
>>106のスクリプトは処理を掲示板に組み込む前に処理の部分だけテストするために作成したものです。
$textは書き込み内容と想定しています。

一番内側の<>をタグと見なしたいです。
xxx<abcd<ddeg<eee<g<fhg>degh><qq>zzz
この場合ですと、<fhg>と<qq>をタグとみなし、他は実体参照化したいと考えています。


113:nobodyさん
07/07/21 02:45:37
つまりタグの定義は
<[^>]*>
ということですね。

114:106
07/07/21 08:55:35 VYWED9XA
>>113
左様です。


115:nobodyさん
07/07/21 09:30:47
違うだろ、<[^<]*?>だろ、112の定義なら。
それ以前に106はエスケープ、エンコード、サニタイズ処理で何か間違ってる
use HTML::Entities;
$tag_re = qr/<[^<]*?>/;
$text =~ s/($tag_re)|(.)/$1||encode_entities($2)/eg;
print $text;

116:nobodyさん
07/07/21 13:10:23 7GHIEbSO
PHPで
URLリンク(localhost)
URLリンク(localhost)
URLリンク(test.com)
から
/index.htm
/index.htm
/index.htm
これを出力したい場合

ereg_replace('^https?://(localhost|test.com)' ,'' ,$line);
これでは間違ってるでしょうか?
どなたか教えて下さい。お願いします




117:たけもー
07/07/27 23:18:07 boPeFaxI
PHPです。

就職率-6月(この全角-を)半角に変えたいです。
$a = ereg_replace("[-]", "-", $a);

どうしたらいいでしょうか?

118:nobodyさん
07/07/28 02:31:21 k6nESKD8
ereg_* はマルチバイト文字(全角文字)に対応していない。
mb_ereg_* か preg_* を使うといい。
ただしpreg_*のほうはUTF-8でないとダメだったと思う。


119:たけもー
07/07/28 15:25:04 9w1k0jgB
PHPです。

就職率-6月(この全角-を)半角に変えたいです。
$a = mb_ereg_replace("[-]", "-", $a);

mb_でもだめでした。
どうしたらいいでしょうか?


120:nobodyさん
07/07/28 15:37:30
文字コードとかどうなっとるん?

121:たけもー
07/07/28 16:32:13 9w1k0jgB
文字コードの意味がいまいちわからないんです、テキストディタは
Shift-JISです、

122:名無しさん@そうだ選挙に行こう
07/07/29 01:50:43
PHPは本職じゃないんで良く知らんのだが、PHP自体がデフォルトの
エンコーディングを持っていて、何も指定しないとそれ使うはずだから、
自分がSJIS指定しているつもりでも、そうでない可能性があるってこと。

<?php

echo mb_internal_encoding() . "\n";
echo mb_regex_encoding() . "\n";

$v = "就職率-6月";

mb_regex_encoding("sjis");
echo mb_regex_encoding() . "\n";

$v = mb_ereg_replace("[-]", "-", $v);

echo $v;

こんなんで置換はできたっぽい。
echo しているのは確認のためなんで気にしないでいい。
いずれにしろ mb_regex_encodingで設定しないとダメだった。



123:たけもー
07/07/30 07:40:51 DqqhKvmn
解決いたしましたw
ありがとうございますw

124:たけもー
07/07/30 21:23:25 TD8Lc2Id
解決したはずが・・・

file(http://)で取得した文字列がUTF-8で
UTF-8からsjisにしたら全角マイナスが消えてしまいます。
消えて、改行されています・・・
テストソースですので
mb_ereg_replace
などで置き換えなどは一切してません。

どうしてでしょうか?

125:nobodyさん
07/07/30 23:11:52
原因知ってるけど正規表現に何の関係が

126:nobodyさん
07/07/30 23:54:01
>>125
誘導してやってくれ。(PHPわからん)

127:nobodyさん
07/07/31 01:38:26
ちなみにPerlも同じだから。正規表現は関係ないけどね。

128:nobodyさん
07/07/31 02:17:21
>>126
変換に使っている変換表の問題(なので正規表現の問題じゃない)。
PHPで使っている変換表の素性はわからん。

ぐぐれば「波ダッシュ問題」あたりとならんで見つかると思うけど
どっかのスレで話題になったか、これ?

URLリンク(www.google.com)

ま、がんがって調べてくれ >たけもー


129:nobodyさん
07/07/31 02:24:36
△▲ WebProg 初心者の質問 Part15 ▼▽
スレリンク(php板)

ここ、かなあ。
つーか、元の要件でもこのスレと無関係な str_replace で済むじゃん。

130:nobodyさん
07/08/10 10:21:28 dRcI3VfS
PHPとか全く知らない者なのですが、利用しているBBSのアクセス禁止設定が
正規表現で指定しろと言うんです。勿論正規表現は知らないどころか初めて耳にしました。

a00abcd1.kngwnt01.ap.so-net.ne.jp
123.123.123.123.ap.yournet.ne.jp

前者のIPが何らかのコード1つに変換されるタイプと後者のIPがそのまま出るタイプの
リモホをそれぞれホスト単位で全て「正規表現で指定」するとずばりどういう表記になるのでしょう?

131:nobodyさん
07/08/10 10:29:11
ホスト数が少ないなら列挙すりゃいいんじゃね。
(xxx.example1.jp|xxx.example2.jp|xxx.example3.jp)

132:nobodyさん
07/08/10 13:25:55
ありがとうございます
なるほど…ひとつをピンポイントで指定する場合は
正規表現というのを使わなくても良いという事なのでしょうか…
130の前者だけなら
a00abcd1.kngwnt01.ap.so-net.ne.jp
と、そのまま指定、両方の二つなら
(a00abcd1.kngwnt01.ap.so-net.ne.jp|123.123.123.123.ap.yournet.ne.jp)
となるんでしょうか?

133:nobodyさん
07/08/10 18:16:54
>>132
そのものずばりというのも正規表現の一種だよ。
 a00abcd1.kngwnt01.ap.so-net.ne.jp
というのも正規表現だよ。

あと細かい話を言うと、ピリオド「.」は正規表現において任意の1文字にマッチするメタ文字なので、
ピリオドそのものにマッチさせたい(他の文字にはマッチさせたくない)ときには「.」の代わりに「¥.」を使う。

 a00abcd1¥.kngwnt01¥.ap.so-net¥.ne¥.jp

んでも、この場合はそこまでしなくても問題はなさそうだけどね。

134:nobodyさん
07/08/10 22:15:38
>>133
どうもありがとうございました!大変参考になりました
というかこれを機会にちょっと勉強してみます…
ありがとうございました

135:nobodyさん
07/08/11 01:30:22 2Sf3pkhN
.*

.+
は、完全に同じ意味と考えてもOKですか?
それとも、何か挙動が変わってくることはありえますか?

136:nobodyさん
07/08/11 02:02:02
.+ 1文字以上の任意の文字列
.* 0文字以上の任意の文字列
で最初から違ってましたね
ナハハ…

137: ◆xIL6SyuS5U
07/08/11 02:39:04
a

138:nobodyさん
07/08/14 22:01:22
perl互換のPHP正規表現を勉強し始めたのですが、
3.3以上に該当するの文字列っていうのは、できますでしょうか?
たとえば3.3.4や3.5、9.0などです。
バージョンのようなものです。
やはり数値型でないと難しいのでしょうか。

139:nobodyさん
07/08/14 22:20:59
バージョン番号文字列って数値型にしてもめんどくさいんだよね。
3.10.0 とかね、真面目にやろうとすると、
'.' で split して、上の桁から順に整数値として比較していく、
みたいにやらないといけなかったりして。

140:nobodyさん
07/08/14 23:03:21
>>139
3.3以上っていう決まりだけならどうかけますかね?
3.2があてはまらなければ大丈夫なんですが。

141:nobodyさん
07/08/15 00:01:44
/\A(?:(?:[1-9]\d+|[4-9])(?:\.(?:[1-9]\d*|0))*|3\.(?:[3-9](?:\.(?:[1-9]\d*|0))*))\z/

142:nobodyさん
07/08/15 00:28:29
3.10 も 3.20 も蹴っていいの?

143:141
07/08/15 01:17:11
うわボケてたアルよ。

/\A(?:(?:[1-9]\d+|[4-9])(?:\.(?:[1-9]\d*|0))*|3\.(?:(?:[1-9]\d+|[3-9])(?:\.(?:[1-9]\d*|0))*))\z/

144:nobodyさん
07/08/15 22:05:09
>>141
ありがとー!ちょっと見てみます!

>>142
厳密にどういった値があり得るのかも分からないのでそこまで細かくしなくてもいいかなという感じです。
バージョンというか、ユーザーエージェントの後によくついている数値なんですが。


145:nobodyさん
07/09/01 14:16:44 tMwZKBAJ
"*"をWebで調べると「直前の文字0回以上の繰り返しにマッチ」とでてくる。
UNIXで
% ls
a0/ a1/ a2/
のとき
% cd *1
ができるけど*は何の繰り返し???

*は何でもマッチと思っていたのは間違いですか???




146:nobodyさん
07/09/01 15:26:18 epTGamb+
>>145
Perl互換の正規表現では 「*」 は量指定子というものの一種でありまして、 文字、 文字クラス、 グループの直後に付き、
それらに0回以上の繰り返しという意味を持たせるのですが、 正規表現体系が違えば 「*」 が違うことを意味することもありましょう。

147:nobodyさん
07/09/01 15:34:18 epTGamb+
要するに、 正規表現体系が違えば記号の意味も異なるということです。

148:nobodyさん
07/09/01 15:58:40 tMwZKBAJ
>>146
>>147
理解しました。ありがとうございました。

149:nobodyさん
07/09/01 16:54:59 fGUplrri
[2ch公式広告]

一瞬、ハーバーライフと間違えるところだった。。
違うよ、コレは。

ヤフオク関連の最強情報
これを知らずして、ヤフオクで稼ぐことは出来ない。(キッパリ)

URLリンク(2ch2.net)

150:nobodyさん
07/09/02 03:27:50
>>145-148

待てw


151:nobodyさん
07/09/02 03:54:38
>>150
どっちも「それは正規表現じゃねえよ」からグダグダと書いても仕方ないから
待たせなくてよい。

152:nobodyさん
07/09/02 09:50:38 RtluGpKC
192.168.50.5 //OK
192.168.*.* //OK
1000.1000.1000.1000/OK
*.168.50.5 //NG

(\d+)(\.([*(\d+)])){3}
なぜこれでダメ?


153:nobodyさん
07/09/02 11:04:51 tGLa/mAn
>>150-151
正規表現とは文字列の集合を表現する手段でありますから、
ワイルドカードを用いた表現も正規表現の一種であります。

154:nobodyさん
07/09/02 11:20:25 tGLa/mAn
>>152
> (\d+)(\.([*(\d+)])){3}

これは数字があり、 その後ピリオドと 「*」、 「(」、 数字、 「)」、 「+」 のどれかの組が3回繰り返す文字列群の表現です。

> *.168.50.5

これは数字の後、 ピリオドと 「*」、 「(」、 数字、 「)」、 「+」 のどれかの組が2回しか繰り返していないので、
先ほどの正規表現にマッチしません。

155:nobodyさん
07/09/02 11:40:01 tGLa/mAn
いや、 待ってください。

> (\d+)(\.([*(\d+)])){3}

だと、

> 192.168.50.5
> 192.168.*.*
> 1000.1000.1000.1000
> *.168.50.5

のすべてにマッチしないはずです。 先ほど

> これは数字があり、 その後ピリオドと 「*」、 「(」、 数字、 「)」、 「+」 のどれかの組が3回繰り返す文字列群の表現です。

と申しましたが、 より正確には、

・ 数字が1つ以上あり、 その後ピリオドと 「*」、 「(」、 数字1つ、 「)」、 「+」 のどれかの組が3回繰り返す文字列群の表現

でありまして、

> 192.168.50.5
> 192.168.*.*
> 1000.1000.1000.1000
> *.168.50.5

のどれもそのような文字列ではないからです。

156:nobodyさん
07/09/02 12:28:15
\.

157:nobodyさん
07/09/02 13:10:37
どうせ1000がいやんって話なんだろうけど、0から255までの
数字だけがマッチする正規表現ってむずくね?
[0-9]|[12][0-2]?[0-9]|[12]?[34][0-9]|1?[5-9][0-9]|25[0-5]
とか
[0-9]|1[0-9][0-9]?|2[0-4]?[0-9]|[3-9][0-9]|25[0-5]
とか

158:nobodyさん
07/09/02 19:09:05
PHPのPerl互換の正規表現のことで質問です。

次のような文章があったとします。
左のは行番号で、実際の文章中にはありません。

01.<div>
02.text
03.<img>
04.</div>
05.
06.<div>
07.text1
08.text2
09.</div>
10.
11.<div>
12.hoge
13.<img>
14.</div>

ちなみにドットは改行にもマッチするようにしておきます。
これに対してパターン「<div>\n(.+)\n</div>」を最小マッチさせると、
サブパターンで02,03と07,08と12,13と17,18,19,20行目がそれぞれきちんとマッチしてくれるんですが、

今度は<img>を含むdivだけをマッチさせようとして、「<div>\n(.+\n<img>)\n<div>」で最小マッチをさせると、
02,03と07,08,09,10,11,12,13行目にマッチしてしまいます。
ここで02,03と12,13行目だけにマッチさせるにはどうすればいいのでしょうか?
いろいろ考えたのですがよくわかりません。
どなたかよろしくお願いします。

159:nobodyさん
07/09/02 19:35:53 /HflMMhV

すいません
「02,03と07,08と12,13と17,18,19,20行目がそれぞれきちんとマッチしてくれる」は
02,03と07,08と12,13の間違いですね

160:nobodyさん
07/09/02 20:08:53
すいません自己解決しました
「<div>\n((?:[^<]|<(?!div))+\n<img>)\n<div>」
これでいけるんですね

161:nobodyさん
07/09/04 05:14:07 p30GnV0e
IPアドレスの正規表現についてやっぱりわからなかったです。
2オクテッド目以降は*が来てもOKとするにはどうすればよいでしょうか?
192.168.50.*
192.168.*.*
192.*.*.*
192.168.50.5
1000.1000.1000.1000
これらはすべてOKとします。


162:nobodyさん
07/09/04 09:42:52
>>161
> 2オクテッド目以降は*が来てもOKとするにはどうすればよいでしょうか?

それ先に言えよ!
どういう結果が欲しくて、どう書いたら、どうダメだったか、を具体的に書かんと。
あと、使用してる処理系 (言語やソフトウェア) も。

で、ダメだった正規表現中の [*(\d+)] だけど、
[] は「文字クラス」の正規表現なので、
>>154 の言っているように * ( 数字 + ) のいずれかの「文字」を表す。
「* または数字」を表現したいのであれば、 (\*|\d+) みたいにする。

ので、こうかな。
(\d+)(\.(\*|\d+)){3}

163:nobodyさん
07/09/04 11:21:03 /G1gxUUQ
$` (マッチした文字列の前にあるすべての文字列 )
↑これの使い方を教えてください。言語はPerlです。

164:nobodyさん
07/09/04 11:29:12
>>163

"hoge" =~ /og/;
print join(",", $`, $&, $'), "\n";

↑こんな感じで、この場合は "hoge" に対して "og" がマッチするので、
$`, $&, $' にはそれぞれ "og" の前の "h", "og", "og" の後ろの "e" が格納される。

165:nobodyさん
07/09/04 11:54:02 /G1gxUUQ
>>164
できました。ありがとうございます。

166:nobodyさん
07/09/09 01:04:12
***.com([0-9]もしくは[a-z]の文字が3つ並び、その後に.com)の表記方法を教えてください

167:nobodyさん
07/09/10 21:26:12 lrmAiBXN
>>166
Perl互換の正規表現だと

[0-9a-z]{3}\.com

168:nobodyさん
07/09/12 05:01:53
>>166
\w{3}\.com

169:nobodyさん
07/09/12 11:22:48 DkIOyoGe
>>168
それだと大文字とアンダースコアにもマッチしてしまいます。

170:nobodyさん
07/09/15 15:32:58
<title>ほげほげ</title>
の「ほげほげ」だけを抜き出すのにはどう表記すればいいのでしょうか?

171:nobodyさん
07/09/15 16:48:18
/<title>([^<]+)<\/title>/

172:nobodyさん
07/09/15 17:17:54
>>171
ありがとうございます。

173:nobodyさん
07/09/16 01:35:56 6P4HpCmY
PHP 4.4.7で

hoge
hage
123.txt

の中から 123 を抜き出したいんだけど
"/^(.+?).txt/"
だと当然

hoge
hage
123

がマッチしてしまう。
hoge や hage は任意の文字列で数字が入る可能性もあるのだけど、どうやって抽出したらいいんでしょう。

174:173
07/09/16 02:11:14
マッチした文字列を
strrev()
で逆順にして、今度は
txt. で再度マッチングさせたらとりあえず抽出できました。それをもう一度逆順に。
こんな力業じゃなくて他に方法があるんだろうな……。

175:nobodyさん
07/09/16 02:19:07
^^

176:nobodyさん
07/09/16 03:52:16 vOvwrq99
>>173
前後にデリミタ (「/」) が付いているという事はPerl互換の正規表現関数を使うのでありましょうが、
そうであれば 「.」 はs修飾子がない限り改行にマッチせず、 よって

/^(.+?).txt/



hoge
hage
123.txt

にマッチせず、 したがって

hoge
hage
123

がキャプチャされることはないはずです。

177:nobodyさん
07/09/16 12:32:40
>>173
まあとにかく「マッチしてしまう」とかいうそのコードを晒してみ。

178:nobodyさん
07/09/16 13:59:22 G/qusHMm
$bairitsu = 0.5;という風に$bairitsuに倍率を入れておいて
height:244pt を height:122pt…
height:244pt を height="150"に
といった具合にheight:●●ptやheight="●●"の数値部分を
$bairitsu倍して置換するにはどのようにすればいいですかね?
やろうとしてることは、エクセルで作ってHTMLで保存したものを、
A4サイズの用紙に合うようにHTMLの中にあるサイズ指定を変更したいです。
使用言語はPerlです。よろしくお願いします。


179:173
07/09/16 15:18:36 6P4HpCmY
>>175
それは……ヒント? それともAA?

>>176
失礼。パターンを行頭にしたり行末にしたり改行文字にしたりしてるうちにこんがらかってしまったみたい。
正確には
"/^(.+?).txt/"
でマッチしました。

>>177
コード的にはこんな感じ。

$string = "
hoge
hage
123.txt
";
preg_match("/^(.+?).txt/", $string, $matches);
preg_match("/txt.(.*?)\r/", strrev($matches[0]), $matches);
echo strrev($matches[1]);
// 結果 123

PHPも正規表現も初心者なので変な書き方してるかもだけど……。

180:173
07/09/16 15:27:38
あれ?正確にはも何も最初に書いたのであってるなあ。
なんで「マッチしてしまう」のだろう。

181:nobodyさん
07/09/16 21:38:24 YMkvDZNb
>>179
ああ、 改行コードをCRにしているのですね。
私は

> 「.」 はs修飾子がない限り改行にマッチせず

と申しましたが、 正確には 「LFにマッチせず」 でありまして、 CRにはマッチします。

普通はスクリプトの内部では文字列の改行コードをLFにするものですが、
何か理由があってCRにしているのですか。

182:nobodyさん
07/09/16 21:48:57 YMkvDZNb
改行コードがLFなら、 m修飾子を使うことにより 「^」 が行頭にマッチするようになるのです。

183:173
07/09/17 00:37:12 /5o1hJUZ
>>181
> と申しましたが、 正確には 「LFにマッチせず」 でありまして、 CRにはマッチします。

あー、そういう事なのか……。
勉強になります。

> 何か理由があってCRにしているのですか。

実はいつも決まった形式で入稿されるテキスト原稿を決まった形式のHTMLにするだけの仕事が定期で入ってくるんです。
で、毎回毎回コピペにつぐコピペで対応し続けるのもバカくさいので極力自動化しようと思い、PHPでシコシコ書いている次第。
そのプログラムに食わせるお客さんからの入稿原稿を元に作ってたのでCRになってました。
試しに改行コードをLFにしてm修飾子というのを試したらうまくいきました。

なるほどもらった原稿をLFに変換してから使えばいいわけだな。
ありがとーございました!

184:nobodyさん
07/09/17 01:05:58 T68tRmUw
あと1つ指摘しますと、 「.txt」 は 「\.txt」 にすべきですね。

185:173
07/09/17 15:37:44 /5o1hJUZ
> あと1つ指摘しますと、 「.txt」 は 「\.txt」 にすべきですね。

おーなるほど。ありがとうございます。

186:nobodyさん
07/09/18 14:10:13 hpuf++fz
Perlを使って、アフィリエイトのコードやJavaScriptなどを含むコメントタグがなぜか削除できません。

例)
<!--
 コード
  ・
  ・
-->

HTMLタグは s/<.*?>//sg; とすれば削除できますが
なぜかコメントタグだけが残ってしまいます。

コメントタグの開始「<」と終了「>」以外の全ての文字列・記号・改行コードを削除したうえで
s/<>//g; としてみましたが削除することができません。

s/<//g;
s/>//g;
とするとなぜか削除できます。

うまく削除できる方法をご存知の方がいたら教えて下さい。

187:nobodyさん
07/09/18 16:31:55
前処理としてまず s/<!--.*?-->//gs やってみたら?
コメントタグのネストはないだろうし(JavaScriptとかで書き出してたら別だけど・・)

188:nobodyさん
07/09/19 07:54:55
>>187
レスどうもありがとう。
s/<!--.*?-->//gsでもなぜかうまくいかないので
コメント行が現れたらif文でスルーするようにしました。

189:nobodyさん
07/09/19 21:54:47
PHPで正規表現勉強したいんですが、オライリーのふくろう本を読めるでしょうか?
もちろん本人の技量にもよると思いますが、Perlをまったく知らない人間がという解釈でお願いします。
逆に文字列処理をしたいなら、Perlを一からやっとけみたいなのもありです。

190:nobodyさん
07/09/20 00:20:26
>>189
preg_.*系関数ならPerl互換なのでふくろう本の記述が使えると思う。
というかね、ふくろう本のキモは処理系にほとんど依存しない3章と4章で、
それ以外はおまけだ。熟読すべし。

191:nobodyさん
07/09/20 01:57:42
ありがとう。時期を見計らって購入するよ。第三版出るみたいだし

192:nobodyさん
07/09/20 02:42:28
>>191
え、日本語訳出るの?


193:nobodyさん
07/09/20 13:36:17 KlmMrt1+
<TD width="52" height="25" bordercolor="#CCCCCC" valign="middle">
<div align="center">F8FA</div>
</TD>

これの

「F8FA」の部分をpreg_match_all取得したいのですが、
'/<TD .*><div .*>(.*)</div><\/TD>/Ums'

としたのですが、何も取得されません。
どのように表記すれば良いのでしょうか?

194:nobodyさん
07/09/20 13:42:18
/<TD.*?><div.*?>(.*)?</div><\/TD>/

こんな感じ?

195:nobodyさん
07/09/20 13:44:34
試してないけどひとまずパッと見でおかしそうなのを直すとこう?
'/<TD .*>\s*<div .*>(.*)<\/div>\s*<\/TD>/Ums'

196:nobodyさん
07/09/20 17:00:54 SqIRO2nC
'#<TD(?:\s[^>]*)?>\s*<div(?:\s[^>]*)?>(.*)</div>\s*</TD>#ms'

197:nobodyさん
07/09/20 19:58:25
>>193
正規表現は二作出てるから次も一年たった今頃出るかなという予想込みだけど出なかったら出ないのもタイミングかなと。

198:nobodyさん
07/09/20 22:27:42
>>197
日本語でおk

199:nobodyさん
07/09/20 23:09:32
>>198
おk!=日本語

200:nobodyさん
07/09/21 00:43:48
>>191
ソースは?

201:nobodyさん
07/10/02 19:12:55 DsttFroa
PHPの正規表現でユーザーエージェント(IE限定)から
ブラウザバージョンとOSのバージョンを取得するため
以下を作成しました
preg_match('/Mozilla\/.*(MSIE [0-9\.]+);.*(Win[^;\)]+|Mac[^;\)]+).*/i', $lua, $match)
ほぼ間違いなく取得できるのですが唯一以下形式のエージェントのみ
失敗します
Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; Yahoo! JAPAN Version Windows 95/NT CD-ROM Edition 1.0.; DigExt)
古いバージョンなので切り捨てても良いとは思うのですが悔しいので
どうすれば正しく取得できるか教えていただけないでしょうか?

上記の正規表現では
MSIE 5.0
Windows 95/NT CD-ROM Edition 1.0.

ほしいのは以下
MSIE 5.0
Windows 98

202:nobodyさん
07/10/02 19:26:37
m#(MSIE\D*[\d\.]+).*?((?:Win|Mac)\D+\d+)#

こんな風でどう?

203:nobodyさん
07/10/02 19:34:02 DsttFroa
>>202
ありがとうございます
おかげ様でできました
比較検証して勉強させてもらいます

204:nobodyさん
07/10/05 23:08:47 ivRnBDKk
質問です

$text = "第41条 [国会]は、[国権]の最高機関であつて、国の唯一の[立法機関]である。";

というテキストで[]でくくられた部分を検索エンジンに飛ばすためのリンクに書き換えるための置換処理を行いたいと考えています。
そこで下のように組んでみたところ

$text =~ s/\[(.*)\]/(<a href=\/http:\/\/foo.bar?query=\"$1\">$1<\/a>)/;

置換の対象となるカッコは行の先頭の[から行の最後の]までが対象となってしまい。上手く機能しません。
この置換処理はどうかけば、いいのでしょうか?


205:nobodyさん
07/10/06 00:06:57
>>204
* や + は、そのままだと最長の文字列でマッチしてしまうので、
最短マッチにするために .*? みたいにすると良い。

あと、繰り返し処理させるために、 g オプション (/.../g みたいな) を付けるよろし。

206:nobodyさん
07/10/06 00:07:46
$text=~ s#\[(.*?)\]#my$r=$1;(my$s=$1)=~s/([^\w ])/'%'.unpack('H2',$1)/ge;
$s=~tr/ /+/;'[<a href="URLリンク(foo.bar?query=)'.$s."\">$r</a>]"#ges;

こんな風でどう?

207:nobodyさん
07/10/06 00:35:40 1+GhnPpX
>>205-206
どちらも上手く機能しました。
奥が深いですね

208:nobodyさん
07/10/06 16:42:21 kTx5Crj6
普通の文字として\を表現するにはどうすればいいですか?
C言語風には、'\\'みたいなやつです

209:nobodyさん
07/10/06 17:45:43
まずはそれを試してみてください

210:nobodyさん
07/10/06 17:50:21 kTx5Crj6
ためしたけど、駄目でした。
\\\ってかいたら一個認識した。
でも\\って連続する文字列は、\\\\\\だと駄目だった。

検索に使ってるエディタは、UnEditorです

211:nobodyさん
07/10/06 18:29:58 C0xnGICK
>>210
「\\\\」 というエスケープシーケンスが解釈されて文字列 「\\」 になり、 文字列 「\\」 が正規表現として解釈されて 「\」 を表すと見た。
その推測からすると、 「\\」 を表すには 「\\\\\\\\」 と打てばよい。

212:nobodyさん
07/10/06 18:34:59 kTx5Crj6
>>211
なんという\
いけました。ありがとうございます。



213:nobodyさん
07/10/07 17:23:56 bdyGFUK8
半角英数文字だと>>205の方法でOKなんすですが、日本語の文字列の場合、エンコードする必要があるので
>>206のようにしなければならないわけですね。今、気がつきましたよ。


214:nobodyさん
07/10/25 15:30:25
phpで、変数にファイル名を入れて処理したいんですが
正規表現で文字制限をかける場合どのように書けばよいでしょうか?

日本語を含まなければ簡単そうですが、、、、

215:nobodyさん
07/10/25 16:34:35
>>214
どゆこと?どんな制限をかけたい?

216:nobodyさん
07/10/27 01:42:21
>>214
つマルチバイト

217:nobodyさん
07/11/05 12:34:21
(愛うえお) [下記kuけこ] saし素せそ [07.07.07]
↑の様にファイルに名前をつけているのですが、これを下のようにリネームしたいのです。
(愛うえお) [07.07.07] [下記kuけこ] saし素せそ

[07.07.07]は日付です。2006/10/15なら[06.10.15]となります。
正規表現でどのように表現したら一括変換できるでしょうか?
どなたか御教示ください。

218:nobodyさん
07/11/05 12:38:12 EztAcqYR
もしスレ違いでしたら案内していただけると助かります

219:nobodyさん
07/11/05 12:47:34
>>217
まずは >>1 の二項目。

220:217
07/11/05 13:09:25 EztAcqYR
>>219
失礼しましたPerl5です。
URLリンク(www.hi-ho.ne.jp)のDLLを使って
Nameryでリネームするつもりです。

的外れなレスだったらすみません


221:nobodyさん
07/11/05 13:59:05
「連続置換・マクロ」にチェックして、こんなんでどう?

s/^(\(.+?\))( \[.+?\] .+?)( \[.+?\])/\1\3\2/

空白の処理とか適当なので、あとは自分で調べていろいろいじってみてちょ。

222:nobodyさん
07/11/05 14:37:50 EztAcqYR
>>221
バッチリできました!ありがとうございました
しかし依頼するカタチを間違えていましたorz
gomennnasaigomennnasaigomennnasai

(愛うえお) [07.07.07] [下記kuけこ] saし素せそ
↑ではなく↓にするにはどうすれば・・・
(愛うえお) [下記kuけこ] [07.07.07] saし素せそ

223:nobodyさん
07/11/05 14:41:33 EztAcqYR
間違えた>>222は無視してください

はぁゆとりすぎて面目ない

224:nobodyさん
07/11/12 05:47:51 Kg6xKnVX
「あいうえおABC+F481ABC+F485かきくけこABC+F7A5さしすせそABC+F3F0ABC+F39EたちつてとABC+F65AなにぬねのABC+F485ABC+F7A5はひふへほABC+F7A5ABC+F39Eまみむめも」

上記の中に、「ABC+16進数x2回」がいくつ含まれているかをPHPの正規表現で表すにはどうかけばよろしいでしょうか?
ご鞭撻よろしくお願いいたします。


225:nobodyさん
07/11/12 10:41:44
>>224
正規表現はいまひとつなのでもっと上手いやり方があるかもしれないが・・・
$input_str = "あいうえおABC+F481ABC+F485かきくけこABC+F7A5さしすせそABC+F3F0ABC+F39EたちつてとABC+F65AなにぬねのABC+F485ABC+F7A5はひふへほABC+F7A5ABC+F39Eまみむめも";
echo preg_match_all("/ABC\+[A-F\d]{4}/",$input_str,$out_ary);
※$out_aryは無いとエラーになるので消さないで


226:nobodyさん
07/11/13 16:45:36 KDxCSN/c
質問です

PHPスクリプトでpreg_match("/^[^@]+@[^.]+\..+/", $superunkoman))
という正規表現があったのですが

^[^@]+   ←最初の文字が@以外の文字の一回以上の繰り返し
@      ←で、@が入り
[^.]     ←この部分が理解できません。

教えてください

227:nobodyさん
07/11/13 17:15:59
>>226
ドット以外の文字列が1つ以上
hoge@.ドメイン.ne.jp
だとか画駄目ってことじゃないの?

228:nobodyさん
07/11/13 17:39:32
>>227
ありがとうございました。そのとおりですね

229:nobodyさん
07/11/13 22:44:37
質問です
phpスクリプトで

$str = ereg_replace(

"(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)",

"<a href=\"\\1\\2\">\\1\\2</a>",

$str);

この正規表現の(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)の部分とhref=\"\\1\\2\">\\1\\2</a>この部分は
何を表しているのか教えてくれませんか?

230:nobodyさん
07/11/14 12:22:47 E8xVrSo0
あげわすれ

231:nobodyさん
07/11/14 13:37:57
>>230
次回からはまずマニュアル嫁

PHPマニュアルより引用
string ereg_replace ( string pattern, string replacement, string string )
pattern の中に括弧でくくられた部分 文字列が含まれている場合、
replacement の中に \\数字 のような部分文字列を埋め込むことも
できます。この部分は、 「数字」番目の括弧でくくられた部分文字列に
マッチする文字列に 置き換えられます。また、\\0 は文字列全体を
指します。9 個までの部分文字列を使うことができます。括弧は
入れ子になっていても構いません。この場合は開き括弧 '(' が
最大 9 個まで使用可能です。


232:nobodyさん
07/11/23 11:29:24 OIbrK2sw
正規表現を先輩から教えてもらったのですが、
文字列 [全ての文字] を 正規表現 [[]([^\]]+)] で 全ての文字 を取り出
すことができますが、
文字列 {全ての文字} で 全ての文字 を取り出す正規表現を教えてください。

233:nobodyさん
07/11/23 15:30:11
>>5

234:nobodyさん
07/11/23 20:53:35 tvqFA7ba
それは無理ですよ
すべての文字
を取り出す事は

235:nobodyさん
07/11/27 18:05:34 fIXcwnBh
Dカップ以上の25歳以下で抽出したいです
PHP5です

236:nobodyさん
07/11/27 19:15:14
[D-Z]カップ.*(1?[0-9]|2[0-5])歳

237:nobodyさん
07/11/28 13:29:18 fpWBgokp
PHPで正規表現であれやこれやと苦戦してます。
で、正規表現チェッカー
 URLリンク(www.asterworld.com)
 という物をみつけて、こりゃ便利だ!と思ってたのですが
作成した正規表現を preg_replace に設定してもマッチしてくれません。
そんなに方言があるとも思えないのですが...

C#2005の正規表現のようなのですがPerlの正規表現と何がちがうのでしょうか。
C#2005の正規表現をPerlの正規表現に変更するには無理なのでしょうか。
Perlの正規表現を作成するようなソフトはあるのでしょうか?

恐れ入りますがどなたか教えてください 頭がゴチャゴチャしてきて..

238:nobodyさん
07/11/28 15:10:44
もっとかなり基本的なところで勘違いしているんではないかと想像。
まずは、これ以上ないってくらい単純な正規表現で挙動を比較してみて、
そこから順次複雑な正規表現にしていって差異を見てみては。

239:237
07/11/28 15:41:05
ネットで調べても、どの言語の正規表現なのか今ひとつ判らないので
取り合えずアマゾンで本を注文しました。
言語ごとの差が判るようなものがあれば...


240:238
07/11/28 15:48:56
C# なら .NET なんだろうけど、「詳説 正規表現 (第2版)」には差異などが載ってる。
それで、ぱっと見で、基本的なところは Perl と .NET とで大した差は無いと思う。

241:237
07/11/29 13:36:57
「正規表現の達人」って本を手にして今、読んでますが、
お昼食べた後なんで眠くて眠くて フワァァ(/ 0 ̄)~゜
がんばってみます。。

242:nobodyさん
07/12/11 20:35:33
すみません、ヘルプをお願いします。
PHPにて、特定の画像ファイル名を持つ<IMG>タグを抽出するという正規表現を作りたいのですが
上手く行かなくて困っております。

どなたか、お助けください。。。

243:nobodyさん
07/12/12 01:18:37
>>242
もちっとくわしく。src属性以外に属性をもつのかとか。
多分alt属性がついていそうだけど。

preg_match('/<img .*?src=(["¥'])特定のファイル名を表す正規表現¥¥1 .*?>/', src);

とかか。今適当に作ったのでうまく動くかどうかはわからんけど

244:nobodyさん
07/12/19 16:38:31 H15tWjcK
PHPのpreg_replaceなんですが、おたたすけ願います。
特定の文字列で囲まれた文字列を変換しない正規表現を教えてください。
たとえば
preg_replace("/aaa/", "[\1]", "aaa aaa aaa aaa aaa")
だと結果は "[aaa] [aaa] [aaa] [aaa] [aaa]" になりますが
preg_replace("/aaa/", "[\1]", "aaa{{{aaa aaa aaa}}}aaa")
となっていたときに
"[aaa]{{{aaa aaa aaa}}}[aaa]" という結果を取得したいんですが
思うように出来ません。

答えを直接出なくてもいいのでヒントだけでも教えてください。


245:nobodyさん
07/12/19 18:16:44
>>244
後読み表明は量指定子を含められないから、もしpreg_replaceだけでやろうとするなら、
それ以外の部分を食わせておいて置き直すという、やや気持ち悪いことになると思う。

例えばこんなふうに
preg_replace('/(.*?(?:\\Q{{{\\E.*?\\Q}}}\\E.*?)*)(aaa)/', '$1[$2]', "aaa{{{aaa aaa aaa}}}aaa");

分解してから対象の部分だけ処理する等の方法も検討した方が宜しいかと。

246:nobodyさん
07/12/19 18:44:19
大田区ホームページ:職員の不祥事について(処分の公表)
URLリンク(www.city.ota.tokyo.jp)

当区職員が傷害の容疑で逮捕されるという事件につきましては、新聞等での報道やホームーページで公表したところですが、今回、事実関係が明らかになり、以下のとおり懲戒処分を行いましたので公表いたします。
 区民の皆様の信頼を裏切ることとなり、誠に申し訳ありません。あらためて、お詫びいたします。

懲戒処分とは
 職員が一定の義務違反を犯した場合に、公務の規律と秩序を維持することを目的として、その責任を追及するために制裁として行う処分です。
 大田区では懲戒処分の公表基準に基づき、免職処分をした場合や特に区民の関心が大きい事案又は社会的影響が大きい事案について、個別の懲戒処分を公表します。
(懲戒処分の制度の詳細は、大田区人事白書をご参照ください。)

処分発令日
 平成19年12月19日

被処分者氏名
 建築調整課 吉原 幸光

処分の内容
 停職3月

処分の理由
 一般非行関係(法令に違反し、全体の奉仕者たるにふさわしくない非行があったため)

事件の概要
 この職員は、平成19年11月16日(金曜日)、勤務時間終了後、東神奈川駅周辺で飲食した後、帰宅途中のJR京浜東北線川崎―蒲田間の電車内において、乗客男性に全治4週間の怪我を負わせる暴行を働き、傷害の容疑により蒲田警察署に現行犯逮捕されました。
 同職員は、東京簡易裁判所に起訴され、罰金刑を申し渡されています。

247:nobodyさん
07/12/22 08:43:52 KKfYoqPi
すみません、教えてください。
PHPで携帯電話に文字列を表示する際に、
電話番号の部分をteltoリンクにしたいと思い以下のように書きました。
$bodySTR = preg_replace('/([-0123456789]+)/', '<a href="tel:\\1">\\1</a>',$bodySTR);

当然ながらこれだと、「100円」や「〒123-4567」にも反応してしまいます。

そこで、
「03-1234-5678」「090-1234-5678」「03-1234-5678」等にマッチして
「100」や「123-4567」にはマッチしない正規表現は可能でしょうか?


248:nobodyさん
07/12/22 14:06:28
可能です

249:nobodyさん
07/12/22 16:17:35
/(0¥d+-¥d{1,4}-¥d{4})/
でどうよ

250:nobodyさん
07/12/22 17:39:05 6MoMAQ1+
perlの正規表現について質問です。
>>244の方と同じ様なものなのですが

"test <a href="URLリンク(test.jp)<)">[test]"
という形にしたいのですが、どのようにすれば宜しいでしょうか。

一度置換した後、<>タグ内の物は[]を外す方法も考えてはみたのですが、
思うように動作させる事が出来ず。ご教授の程、宜しくお願い致します。


251:nobodyさん
07/12/22 17:52:18
s/(<.*?>|test)/$1?$1:"[$2]"/ges

252:250
07/12/22 18:04:13
>>251
なるほど、どうも有難う御座いました!

253:nobodyさん
08/01/14 12:16:38 6AXqvVgD
時間(13:00:00~18:00:00)までを正規表現であらわしたいのですが、

1[3-8]:[0-5][0-9]:[0-5][0-9]

という感じに今なっています
誰が見てもわかりやすいしこれでもいいのですが、もっと短い書き方はないものでしょうか?

[0-5][0-9]ここが反復なので、([0-5][0-9]:?){2}とか思いつくのですが、
これだと最後にコロンが入っててもマッチしてしまうので回避できるような書き方はないものかなぁと。

254:nobodyさん
08/01/14 13:51:53
1[3-8](?::[0-5]\d){2}

255:nobodyさん
08/01/15 02:35:00 HyHnFj45

私が小学生の頃、
日本中でノストラダムスの予言が大流行していた。
「1999年の7月に人類は滅亡する!」
という例のお騒がせ終末予言である。

大人になって社会に出て働きだして、
あくせくと忙しく日々を過ごしながら、
1999年は、
ありふれた日常の中であっさりと過ぎていった。
人類は滅ばなかった。

これからここで、
1999年に起こるかもしれなかった人類の壊滅的破局を、
誰にも知られずにこっそりと回避させた人たちがいた...
という設定で、
荒唐無稽なストーリーを描いてみたい。
無論、100%完全なフィクションである。

URLリンク(www5.diary.ne.jp)


256:nobodyさん
08/01/20 11:20:53 TPbCvsXG
/([^>|\+|\s]+)\s*([>|\+]?)\s*/g

この正規表現はどういうことでしょう?
何にマッチさせようとしているのでしょうか。
JavaScriptです。

257:nobodyさん
08/01/20 11:37:26
[]の中で|を使ってOR条件にしてるから書いた人は勘違いしてる

258:nobodyさん
08/01/20 12:50:55 TPbCvsXG
本来なにをしたかったんでしょうか・・・。

259:nobodyさん
08/01/21 16:00:34
PHPの正規表現についての質問です。
2chのdatを各要素毎にキャプチャしたいのですが、

preg_math_all('/((.*)<>)*/', $dat, $match);

と書いて実行すると全体が丸々$matchへ格納されます。
$datへは「 要素1<>要素2<>要素3<>要素4<>要素5 」という形式のデータが入っており要素5は1行目にのみ存在します。
また、各要素は空欄の場合もあります。

初歩的な質問で申し訳ありませんが、よろしくお願いします。

260:nobodyさん
08/01/21 16:01:39
>>258
こちとらお前さんにそれを聞きてえぐらいだよ。

261:nobodyさん
08/01/21 16:03:38
>>259
preg_split で "<>" で配列にばらした方が扱いやすいかも。

262:259
08/01/21 16:15:53
>>261
レスありがとうございます。
確かにphpには要素を分解する為の便利な関数が始めから用意されておりますが、今回はあえてpreg_matchを用いて自身で分解してみたく思います。
自分にはハードルが高い気もするので、手始めに要素5だけを取り出そうと挑戦してみたのですが、

/<>(.+)$/ と書くと要素3<>要素4<>要素5がキャプチャされてしまいます。
やはり当方の正規表現に対する解釈が根本的に間違っているのでしょうか。

連投になり大変申し訳ないのですが、こちらの質問へのみご回答お願いいたします。
>>259は回答を得ましても自分には理解の範疇を超えていると判断しましたので)

263:nobodyさん
08/01/21 19:42:35
[^<>]

264:259
08/01/21 20:27:24
自己解決しました

265:nobodyさん
08/01/21 22:14:14
>>264
どう解決したかくらいは書いてもバチは当たらなくってよ。

266:nobodyさん
08/01/30 11:50:28
perlのgrepで大文字小文字の区別をつけて検索したいです。
@hitlist = grep(/$search_word/i, @search_list);
これを、
@hitlist = grep(/$search_word/$serch_option, @search_list);
($serch_optionにはiやgを事前に設定)
こんな感じにしたいのですが、なんかいい案はありますか?
if文で分岐させるしかないですか?

267:nobodyさん
08/01/30 13:19:43
大小文字区別つけて検索したいならオプションなしで固定でいいでしょ
そこでgオプション使うケースなんてないでしょ

268:nobodyさん
08/01/30 16:28:40
>>266
質問が要領を得てないんだろうけど、
大文字小文字区別つけるかつけないかを切り替えたい、って話ではないかと。

どうすれば良いのかは知らないけど。

269:266
08/01/30 17:01:36
質問の要領が悪くて申し訳ありません。
正規表現のオプションをうまいこと制御できないかなと思いまして。
特に大文字小文字にこだわってるわけではないです。

270:nobodyさん
08/01/31 03:02:38
>>269

大小文字の違いを無視して検索したいときに、パターンの先頭に (?i) 埋めときゃいい。

$pat = ($icase ? "(?i)" : "") . $search_word;
@hitlist = grep /$pat/, @search_list; 

とか

 


271:nobodyさん
08/01/31 15:56:15
proxomitron の正規表現(?)が独自過ぎて、イライラしてくるんだが…

272:nobodyさん
08/02/25 06:25:28 PeKKba69
2008-03 発売(予定)
「詳説 正規表現 第3版」 (Jeffrey E.F. Friedl 著 / 長尾高弘 訳)
ISBN 978-4-87311-359-3 定価 5,040円


273:nobodyさん
08/02/25 12:38:04
高いね。今は Web で検索すればいいからねぇ…今更そんなの出して売れるのか。

274:nobodyさん
08/03/03 22:23:33 3LUWkmBW
質問です!
PHP 5.2.5で、<br>以外のタグ削除を下記のようにしたところ

do {
$res = str_replace( $result_tag[1], '', $res );
} while ( mb_ereg( '(<[a/][^>]+>)', $res, $result_tag ) );

所々で効いてません。
前のサーバー(PHP 4.4.4)では正常に動いていました。
よろしく御指南ください。

275:nobodyさん
08/03/03 23:15:55
>>274
初心者なので間違ってたらごめんなさい。

strip_tagsで、タグ除去と除外タグ指定が可能なはずです。

276:nobodyさん
08/03/04 02:59:10
>>275
ありがとう!
思い通りになりました。
感謝です。

277:nobodyさん
08/03/05 17:20:52
<a href="URLリンク(jumpres)">>>1</a>
<a href="URLリンク(jumpres)">>>34</a>

スレッドまとめサイトの作成においてアンカーのタグだけ外したいのです
よろしくお願いします

278:nobodyさん
08/03/05 18:23:39
>>277
実装言語が Perl と仮定して (Perl でなければ >>1 を読んでちょ) 、こんなかんじ?
s/<a href=".+?">(.+?)<\/a>/$1/g;

279:nobodyさん
08/03/05 18:52:35
ありがとうございます

280:nobodyさん
08/03/16 09:40:37
PHPの正規表現はバグバグなのでバージョンが違えば動作が変わる上に、難しいパターンになるとすぐ落ちる。

281:nobodyさん
08/03/16 12:34:04
嘘書くなよ。

282:nobodyさん
08/03/16 20:44:54
パターン修飾子にパラメータを渡して、長い文字列を検索するとボロボロ落ちる。常識だよ。

283:nobodyさん
08/03/17 06:09:10
rubyのutf-8判定とかもやばそうだね

284:nobodyさん
08/03/17 08:59:29
pcreのバグだね。
pcre-devのメーリングリストでもよんどいて損はない
URLリンク(www.exim.org)

285:nobodyさん
08/03/19 14:02:11 6LA3ff9b
初めて書き込みさせていただきます。

たとえば文字列が

{if(a)}
あああ
{if(b)}
いいい
{/if}
{/if}

と入れ子があったときはどのようにマッチさせたらいいでしょうか?
PHPでお願いします。

286:nobodyさん
08/03/19 15:32:59
入れ子のマッチは正規表現 (だけ) では無理。と憶えておくと良いことがあるらしい。

287:ジョアン
08/03/28 16:46:01 FsCFbn2K
perl の正規表現をPHPに書き直しているのですが、どうしてもわかりません。
Perlではマッチした前後を $` $' で取得できますがPHPではどうして取得するのでしょうか?


288:nobodyさん
08/03/29 12:12:17
つマニュアル


289:nobodyさん
08/04/12 11:24:34
見 れる

290:nobodyさん
08/04/13 12:03:16
>>287
括弧

291:nobodyさん
08/04/26 13:57:41
age

292:nobodyさん
08/05/04 23:26:54
オライリーの正規表現三版
ほしいけど高いね

293:nobodyさん
08/05/19 20:19:05
phpでhoge("****","*****");の****と*****を[1][2]に入れたいのですがどうすればいいでしょうか?

294:nobodyさん
08/05/23 20:19:21
AGE

295:nobodyさん
08/05/23 20:19:44
AGE

296:nobodyさん
08/06/05 16:44:59 0yepAPED
すみません、FC2ブログのIPブロック条件のために、正規表現を書かなければならなくなりました。
そこで、合っているか教えてくださいー。

IP 61.78.0.0~61.85.225.225 をブロックしたいのです。

このための表現として、私のつたない知識を使って書いてみると

^61\.[78-85]\.[0-9]+\.[0-9]+

なのかなと思ってますが、あってますか?
どうぞよろしくお願いします。

297:nobodyさん
08/06/05 17:25:51
^61\.(?:7[89]|8[0-5])\.

こうじゃないかな

298:nobodyさん
08/06/05 18:12:26 0yepAPED
>>297
ありがとうございます。

^61\.[78-85]\. のところが、^61\.(?:7[89]|8[0-5])\.
って言う意味ですよね?
なるほど。78-85じゃダメなんですね。ありがとうございます!


299:nobodyさん
08/06/06 03:25:44
これが一番わかりやすい。以上

^61\.(78|79|80|81|82|83|84|85)\..*


300:nobodyさん
08/06/08 17:41:28
PHPで、1ページ分のHTMLのソースが$sに入っているとします。

ここで、この$sから特定のタグだけを削除したいのですが、うまくいきません。

例えば<meta ~~~ />というタグが複数あったとして、これをすべて取り除いたソースを作りたいのです。

$s = eregi_replace("<meta.*?>", "", $s);

とやってみたのですが、$sが空になってしまうのです。

ご指南ください。

301:nobodyさん
08/06/08 22:40:27
2過去ログぐらい嫁という言葉は一見突き放しているように見えて
その質問の答えはこのスレの中にあるよという、ヒントを出しているわけで
まぁ、ツンデレなわけです。

302:nobodyさん
08/06/09 02:40:38
>>300
ereg は最短マッチの芸当はできない。
pregでもつかっとけ。


303:nobodyさん
08/06/09 06:50:27
>>300
'<meta[^>]*>'

304:nobodyさん
08/06/09 23:50:23
300です。

ありがとうございます!

そうなんです、最短マッチが動かないなぁと思っていて、まさかeregが
最短マッチできないとは思いませんでした。

pregでやって解決しました!!


305:nobodyさん
08/06/11 15:58:44
300と似てるかもしれないのですが
<a href="aa">11</a><a href="bb">22</a> こういう文字列があるとき
11と22だけを取り出したいと思い
preg_match_all("/<a(.*)>(.*)<\/a>/", 元, $test)
とやってみたところ、取り出せたのが
href="aa">11</a><a href="bb"と22になってしまいました。
?をつけてみてもうまくいきませんでした。

意図したように取り出したい場合どのように記述すればいいのでしょうか?
使用している言語はphpです。

306:nobodyさん
08/06/11 21:01:33
>>305
色々間違えてる。

まず、Aタグで囲んでる部分だけ抜き出すなら( )のペアは一個でいいはず。
次に?を使ってみたと言うが多分何か勘違いしてる。
300はわかってて最短マッチさせてるが305わかってないだろう?
*を?に置き換えたりしてないか?

307:nobodyさん
08/06/12 00:47:05 Hj50XmAm
JavaScriptで下記のようなデータを取得したいです。

hogehoge[1]→1
hogehoge[123]→123
hogehoge[1243][]→1243

[]の中身を取得したく、[]が2つあった場合は最初の[]の中身を取得します。
(ただし、2個目の[]は常に空です。)

hogehogeは任意の文字列で、[]の中身は何桁か分からない数字の繰り返しです。

以上ご鞭撻の程お願いします。

308:nobodyさん
08/06/12 08:16:53
>>307
スレタイ

309:nobodyさん
08/06/12 14:43:44
/\[([1234]+)\]/

310:nobodyさん
08/06/12 14:53:37
GJ

311:nobodyさん
08/06/28 08:39:36 9QUTsyON
PHP質問スレから誘導されてきました。

使用言語はPHPです。
以下のような変数があります。
$str = <<<EOM
あああ<br />
いいい<br />
ううう<br />
<!--S-->
えええ<br />
おおお<br />
<!--E-->
EOM;

このうち<!--S-->と<!--E-->で囲まれている<br />だけを削除したいのですが、
正規表現を使って綺麗に書けるでしょうか?
以下のように試したのですが、<!--S-->と<!--E-->が消えるだけでした。
$str = preg_replace("/<!--S-->([\W\w]+)<!--E-->/",str_replace("<br />","","\\1"),$str);
また、<!--S(E)-->で囲まれている部分は改行や半角英数字などが含まれる場合があります。
どなたかご教示いただけますでしょうか。よろしくお願いいたします。

312:nobodyさん
08/06/28 10:12:28
substr_replaceとstrposでできそうな気がするが

313:311
08/06/28 12:26:16
>>312
ありがとうございます、おかげで解決しました!

314:nobodyさん
08/07/02 18:58:36
,"/web/sendmail.php","10","10","2000"
こういう感じの文章の
,"2000"
のみ抽出したいんですが、どう書けばいいんでしょうか?

",".*[0-9]"$
だと"10","10","2000"まで拾っちゃうんです・・・。

315:nobodyさん
08/07/02 21:54:01
,\"[0-9]{4}\"

316:314
08/07/03 15:40:28
>>315
ありがとうございます。
確かに、それで例は拾えましたが、10と2000の部分は変動するんです。
桁も4桁だったり5桁だったりと様々なので、どうしたもんかなと・・・。

317:nobodyさん
08/07/03 15:46:05
,\"[1-9][0-9]*\"

318:314
08/07/03 15:53:01
>>317
ありがとうございます。

それだと ,"10","10","2000" まで拾ってしまいます・・・。
書き忘れていましたが、秀丸を使って一括選択しています。

319:nobodyさん
08/07/03 16:04:08
> 10と2000の部分は変動するんです

どう変動するんだよ
とり出したい場所の条件を日本語で書いてみ

>315を5桁にも対応させるだけなら
,\"[0-9]{4,5}\"

320:nobodyさん
08/07/03 16:05:46
>>318
,\"[1-9][0-9]*\"$


321:314
08/07/03 16:14:35
>>320
ありがとうございます!!!出来ました!!!
ありがとうございましたー。

>>319
ありがとうございます。
>>320で解決しましたが、極端な話1~99999999の間で変動します。

322:nobodyさん
08/07/03 16:21:37
>>321
自然数と言え

323:nobodyさん
08/07/03 18:01:39
314 は情報小出し厨という事が解ったから、はやく死ね

324:nobodyさん
08/07/03 19:43:29
そもそも正規表現スレで「こういう感じの文章」なんて質問する時点で(ry

325:nobodyさん
08/07/03 20:01:56
抽象的な表現の質問はスルー

326:PHP
08/07/04 18:37:34 DM0Om0jz
PHP 正規表現

PHPの正規表現を勉強しているのですが、どうもうまくいきません。今回は一番簡単な正規表現をつくったのですが、どうやったらよいのでしょうか。

$h = '(名前)様の会員IDは(abc12)で、(5)番目に偉い方です。';

とあったら、名前、会員ID、番号を抜き出すには、どのようにしたらよいのでしょうか?
実際に()は使用しません。
また、$1 や $2 などを使いたいのですが、解説までできればお願いしたいです。
一応自分なりに考えました。
preg_match('/^*.([a-zA-Z0-9]){2}([0-9]+)','名前$2.ID$1 $3 番目に偉い');
()を使えば、2つマッチさせたいときなどに分けることができるのでしょうか?
(名前)様は(数字)
例:太郎様は5

このとき太郎様という日本語の文字を取得するには/^(+.)([0-9])$/

ここで名前は$1になり、数字は$2になるのでしょうか?
どのような時に$1や$2がどっちがどっちなのかは、どのようにしたらわかるのでしょうか?


長々した質問すいません。わかるかた教えてください。

327:nobodyさん
08/07/04 23:02:41
URLリンク(www.php.net)

取り敢えず、ここを *よく読んで理解* しろ。

328:nobodyさん
08/07/15 00:11:32 PMHjKbcP
質問させて下さい。
PHP5を使っています。
PHPの正規表現関数を使ってデータを取得しようと思っているのですが上手くいきません
<INPUT maxLength=20 name=id value="">
このような文字列を対象に、文字列「type」が含まれていない場合、後方の「maxLength=20 name=id value=""」
を取得したいのです。
全文に対して繰り返し取得したいのでpreg_match_allを使っています。

preg_match_all( "/<input (^type)[^<](.*?)>/is", $data, $matchs )
このように書いたのですがヒットしてくれません。
ドキュメントを見ると、特定文字に関しては[^a-z]のような書き方で対応できるのですが
文字列に関してはどのようにすればよいのでしょうか?
アドバイス頂ければ幸いです。
宜しくお願い致します。

329:nobodyさん
08/07/15 02:02:18
>>328

悪いこたいわないから二段階で抽出しとけ。
先読みを使えば書けないこともないけど、メンテできなくなるぞw


330:328
08/07/15 03:07:47 PMHjKbcP
>>329
レス有り難う御座います。
一段階目は
preg_match_all( "/(<input 「typeを含まない文字列にマッチするような正規表現」[^<]>)/is", $data, $matchs )
となると思うのですが、この部分はどのようにして書けばよいのでしょうか?
はじめ、二段階抽出も考えたのですが、結局
「typeを含まない文字列にマッチするような正規表現」がどうしてもわからずでした。

331:328
08/07/15 08:05:16
自己レスですが、夜通し色々試していたらいけました。
お騒がせしました。
取りあえず、該当範囲をpreg_match_allで取得後、preg_matchでtypeがあるか判定して二段回抽出しました。

332:nobodyさん
08/07/17 17:35:14 LcfXPY+p
<<が出てきて、その後初めて<br><br>が出るところまでのマッチ方法を教えてください。
pregです。

例えば、
hogehoge<<hogehogeh<br>oge<br><br>hogehoge<br><br>hoge<<hoge の
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~    の部分です。

333:nobodyさん
08/07/17 17:53:17
<<.*?<br><br>

334:332
08/07/19 19:22:36
>>333
333おめです
なぜか、
hoge<<hogehog
eh<br>oge<br><br>hoge
だとマッチしないのですが。

335:nobodyさん
08/07/19 19:32:09
<<【¥S¥s】*?<br><br>

336:nobodyさん
08/07/20 09:34:06
できました。スマソ

337:nobodyさん
08/07/20 11:43:35
携帯絵文字をすべて
「絵」に置き換えすることはできないのでしょうか?
preg_replace("/[ - ]/","絵",$hoge);

338:nobodyさん
08/07/20 12:01:15 LU799vx+
>>337
キャリアは?

339:nobodyさん
08/07/20 12:03:54
>>338
SoftBankです。
余裕があればau,DoCoMoもですが。。。

340:nobodyさん
08/07/20 12:18:57
>>337
置き換える事はできるけど、正規表現だけでは無理

341:nobodyさん
08/07/20 12:27:01
>>340では、正規表現以外のものもOKなので、
教えていただきたいです。

342:nobodyさん
08/07/20 13:09:57
絵文字 変換 preg とかでググればいくらでも出てくるだろ。。。
ここで聞くより100倍速い。

343:nobodyさん
08/07/24 00:50:31 /c2OsNI4
example.htmlに書かれた
<table>

344:nobodyさん
08/07/24 00:58:57 /c2OsNI4
>>343
誤爆した。。申し訳ない。。
example.htmlに書かれた
<table>
<tr><th>2ちゃんねる</th><td>WebProg板</td></tr>
</table>
をphpのfopen, fgetsで1行ずつ読み取っています。
<tr>から始まった行の「2ちゃんねる」とWebProg板「WebProg」部分のみ抽出したいので
preg_replace("/^<tr><th>(.*?)</th><td>([a-zA-Z])</td>/i","$1$2",$str);
としたのですが、うまく抽出できません。
アドバイスをいただければありがたいです

345:nobodyさん
08/07/24 01:43:31
/^<tr><th>(.*?)</th><td>([a-zA-Z])</td>/i

正規表現が / で始まってるから / で終わることになるわけだけど、途中に</th>ってのがあるわけよ

m#<t[dh][^>]*>(.*?)</t[dh]><t[dh][^>]*>(\w+)#i
こんな感じになるかな

346:nobodyさん
08/07/24 23:33:27
デリミタの問題だけじゃないの?
preg_replace("/^<tr><th>(.*?)<\/th><td>([a-zA-Z])<\/td>/i","$1$2",$str);


347:nobodyさん
08/07/25 08:54:32
これって[a-zA-Z]、[a-zA-Z]+こうしなくてもいいの?

348:nobodyさん
08/07/27 01:11:32 sEx2Pn85
質問させてください。

サクラエディタに鬼車5.9.1を搭載して正規表現の勉強をしているのですが、手元にある詳説正規表現には

(<)?\w+(?(1)>)

このような例があり、<があれば>のマッチを試みる?ということができるみたいです。

ただ、鬼車はこの表現をサポートしていないみたいです。
URLリンク(www.geocities.jp)

同様のことを鬼車でも実現する方法ってあるのでしょうか?

349:nobodyさん
08/07/29 05:43:25
一番最初に出てきた「=」だけ反応するにはどうしたらいいでしょうか。
C#です。

350:nobodyさん
08/07/29 19:46:22
行頭の=という意味なら
/^=/m
だけどC#での正規表現の使い方は知らんので応えられん。

351:nobodyさん
08/08/06 01:01:06 hVakYDWk
PHP5覚えたての初心者です
スレ冒頭に()と(?:)の違いについて質問されてましたが
?:の意味ってなんですか?
わかりやすい解説ページなどもあれば教えてください。

352:nobodyさん
08/08/06 02:34:12
google

353:nobodyさん
08/08/06 19:40:10
>>351
?:じゃ?と:だよ。
(?:~)で意味をなす。

354:nobodyさん
08/08/21 14:34:46 wSsr/o3s
質問させて下さい。
PHP5を使用しています。
文字列内にマルチバイト文字が一つでも含まれていれば真と言う正規表現を行いたいのですが
どのようにすればよいでしょうか?
ドキュメント等から調べてみて、
mb_ereg("[0-9a-zA-Zあ-んア-ン]", $str )
のようにしてみたのですが、これでは漢字にヒットしません。

アドバイス頂ければ幸いです。
宜しくお願い致します。

355:nobodyさん
08/08/21 14:44:38
単純に先頭ビットがおったってるかどうか見ればよくない?

[\x80-\xff]

356:nobodyさん
08/08/21 15:28:45
>>355
ありがとうございます。
やってみます。

357:nobodyさん
08/08/22 02:32:16
>>354
1バイト文字を列挙したのを否定すれば?

あと、文字コードによっては半角カナがマルチバイトだったり
そうじゃなかったりするんだけど、どうするのかな?


358:nobodyさん
08/08/25 10:35:16 P/JycA8t
htmlのタグを削除するのに、ふつうは
$line =~ s/<\/?[^>]+>//g; ----(1)

だと思うけど、どこかで見た方法では、

$line =~ s/<[^>]*(>|$)//g; ----(2)
となってた。これ動作は同じなのかな?(2)の意味がイマイチ分からない。

359:nobodyさん
08/08/25 20:52:33
(1)の \/? は書いても意味ない(/は[^>]に含まれるから)
(2)の (>|$)は、$lineという変数名から推測するに行単位で読み込んで逐次処理した
場合に、タグの途中で改行されていて>が見つからなくても行末まで削除する為?
でもそうしたら次の行で処理がうまく行われないしよくわからん

行単位だとタグ途中で改行される場合もあるから全部読み込んで一気に処理がいい
s/<.*?>//g;
s/<[^>]*>//g;
などなど・・

360:359
08/08/25 21:09:55
間違った、s/<.*?>//g;だと改行に対応できないから
s/<[\s\S]*?>//;みたいになるね

361:nobodyさん
08/08/25 21:28:12
いや、s使うだろ、普通。

362:nobodyさん
08/08/25 22:34:46
>>358
(2)はSGMLのショートタグの対応とか?
URLリンク(www.asahi-net.or.jp)

開始タグで前のタグを閉じる以外は、メジャーなブラウザは対応してなかったはずなので、
あまりこだわらなくてもいいと思うけど。

363:358
08/08/25 23:08:43
ありがとうございました。
改行文字の件とか、勉強になりました。
プログラム上では、どちらも同じ動作なので、気になってたもので。


364:nobodyさん
08/08/27 15:31:16 j0h2/LpG
正規表現で悩んでいます。
preg_match_all( "/((aaa|bbb|ccc).*?)(aaa|bbb|ccc|$)/is", $str, $maches )

このような形にて以下のような内容の繰り返し文を部分的に抜き出そうとしているのですが一部上手くいきません

---------------------
aaa
あいうえお

bbb
かきくけこ

ccc
さしすせそ
---------------------
上記正規表現では
aaa
あいうえお

bb
かきくけこ

cc
さしすせそ
と言うように一つ目以降のパターンマッチ文字列の先頭がbbやccとして一文字かけてしまいます。
本来はbbb、cccとちゃんとヒットさせたいのですが、これが行えません。
マッチ後の文字列ポインタを「三歩歩いて二歩下がる」のようにずらす事をするか、何か他のパターンマッチ構文を
書けばいけそうだと思うのですが、どうにもよい方法が思いつきません。
お力添え頂ければ幸いです。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch