[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 07/03 06:01 / Filesize : 179 KB / Number-of Response : 640
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

正規表現道場



1 名前:nobodyさん [2007/01/11(木) 02:40:43 ID:uW7xEbZY]
【正規表現道場の掟】

・言語不問

・質問も大歓迎。使用言語を書くのを忘れずに。

正規表現と関係ない話・質問は他スレへどうぞ。

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

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


46 名前:nobodyさん mailto:sage [2007/03/02(金) 01:04:13 ID:???]
保守

47 名前:nobodyさん [2007/03/10(土) 16:03:45 ID:VXyj5Dh3]
<?
$str = "/get/data/&country=2&url=www.example.com/?url=http://www.example.com";

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

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

48 名前:nobodyさん mailto:sage [2007/03/11(日) 04:44:19 ID:???]
>>47

url=www.example.com/?url=http://www.example.com
がとれりゃあいいのか?

url=.*$

で何か不都合ある?


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

¥?

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

50 名前:nobodyさん mailto:sage [2007/03/12(月) 12:48:47 ID:???]
バックスラッシュを前に置く。

51 名前:nobodyさん [2007/03/12(月) 14:27:04 ID:DmSqMrCU]
ばっちですた!

52 名前:nobodyさん [2007/03/18(日) 21:25:07 ID:7HFdTRo7]
教えてください。

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

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

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

53 名前:52 mailto:sage [2007/03/18(日) 21:25:46 ID:???]
すいませんphp4です。



54 名前:nobodyさん mailto:sage [2007/03/18(日) 22:00:48 ID:???]
こうしたらこうなるって結果を一行にまとめて

55 名前:nobodyさん mailto:sage [2007/03/19(月) 08:43:07 ID:???]
>>52
"\\1" . $in . "\\2"
"\\1{$in}\\2"

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

56 名前:52 mailto:sage [2007/03/20(火) 00:34:39 ID:???]
>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さん [2007/03/23(金) 00:39:31 ID:P+rVOV8A]
$str = "foo@=barfoo@=bar";
$str = preg_replace('/foo.*(=)bar/', "a\\1b", $str);
を実行した場合の結果をa=ba=bにしたいのですが、
実際はa=bになってしまいます。
どこが間違っているのでしょうか?

58 名前:nobodyさん mailto:sage [2007/03/23(金) 02:15:09 ID:???]
>>57

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


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

60 名前:nobodyさん mailto:sage [2007/03/23(金) 10:45:01 ID:???]
「ある文字列を含まない文字列」の正規表現はめんどいので最短マッチ .*? で。

61 名前:57 mailto:sage [2007/03/23(金) 16:57:03 ID:???]
>>60
おお!それでできました。
ありがとうございます。

62 名前:nobodyさん mailto:sage [2007/03/24(土) 01:11:05 ID:???]
>>59

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

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

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


63 名前:nobodyさん [2007/03/24(土) 12:15:47 ID:yU007f6l]
<html>
<head>
<title>テスト</title>
</head>
<body>
<!-- ここから -->
あああああああああああ<br />
あああああああああああ<br />
あああああああああああ<br />
あああああああああああ<br />
あああああああああああ
<!-- ここまで -->
</body>
</html>

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

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



64 名前:nobodyさん mailto:sage [2007/03/24(土) 13:41:28 ID:???]
>>62
> 不用意に最短マッチ使ってるとパフォーマンスで泣くよ?

kwsk

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

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

66 名前:nobodyさん mailto:sage [2007/03/25(日) 02:07:05 ID:???]
>>65
その記述だとパターンの部分でエラーがでない?

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

68 名前:nobodyさん mailto:sage [2007/04/07(土) 04:03:00 ID:???]
>>67
Datteクラスかなんかに文字列食わせて、例外飛ぶかどうかで
判定したら?

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



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

70 名前:nobodyさん mailto:sage [2007/04/08(日) 16:37:48 ID:???]
>>68
ああ、そういうことなのね。

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


71 名前:nobodyさん [2007/04/15(日) 02:12:22 ID: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さん mailto:sage [2007/04/15(日) 02:14:51 ID:???]
ああ半角空白の連続ダメなんだっけ インデント消えちゃた

73 名前:nobodyさん mailto:sage [2007/04/15(日) 03:03:32 ID:???]
>>71
jp.php.net/manual/ja/function.dirname.php
及び関連項目を参照。



74 名前:73 mailto:sage [2007/04/15(日) 03:04:35 ID:???]
あ、ごめん。正規表現スレだったね。無視して。

75 名前:73 mailto:sage [2007/04/15(日) 03:10:35 ID:???]
で、考えてみたんだけど、

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

こんな感じでどう?


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

77 名前:nobodyさん mailto:sage [2007/04/15(日) 09:05:07 ID:???]
PHPなら、dirnameとbasenameつかえば正規表現なんか使う必要一切ないだろ

78 名前:nobodyさん mailto:sage [2007/04/15(日) 11:13:03 ID:???]
>>77
>>73-74

79 名前:71 mailto:sage [2007/04/15(日) 11:28:41 ID:???]
正規表現無しだとこんな感じでした

$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さん [2007/05/03(木) 19:11:49 ID: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 [2007/05/03(木) 19:17:55 ID:meD6A7ah]
すいません。↑の$emojiSjisCharsは$sjisCharsの命名間違えです。

82 名前:nobodyさん mailto:sage [2007/05/03(木) 19:26:15 ID:???]
ちゃんと読んでないけど
(?:絵文字のコード) な部分を (?:絵文字のコード)+ にするだけではないの?

83 名前:80 [2007/05/03(木) 20:24:41 ID: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さん mailto:sage [2007/05/04(金) 00:29:52 ID:???]
オライリーの詳細正規表現の本って
通常のと第2版ってのがあるけどどっちがいいのよ?

85 名前:nobodyさん mailto:sage [2007/05/04(金) 03:16:56 ID:???]
>>84
通常のって初版のことかい?
そりゃあ新しい方が。

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


86 名前:nobodyさん mailto:sage [2007/05/10(木) 19:57:43 ID:???]
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さん mailto:sage [2007/05/10(木) 20:35:51 ID:???]
>>86
> $pattern = "/<html_start>(.*)<html_end>/";

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

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

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

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

88 名前:nobodyさん mailto:sage [2007/05/10(木) 20:51:04 ID:???]
>>87
s修飾子で動作しました!ありがとうございます。

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

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

89 名前:nobodyさん mailto:sage [2007/05/10(木) 21:18:19 ID:???]
案外この手の質問したい人もいるんだね

90 名前:86 mailto:sage [2007/05/14(月) 15:45:03 ID:???]
後方置換する時に関数かましたくマニュアル眺めてたら「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 mailto:sage [2007/05/14(月) 17:55:10 ID:???]
>>86ですが
自分で見返してたらこれは既に正規表現でなくPHPの質問な気がしてきましたので該当スレに
移動しますです。
スレ違、申し訳ありませんでした。

92 名前:nobodyさん mailto:age [2007/05/17(木) 13:08:20 ID:???]
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さん mailto:sage [2007/05/17(木) 13:53:20 ID:???]
>>92
正規表現で foo || bar みたいなのはないっしょ。
/^(210...(中略)...|215...(中略)...)$/ みたいな。

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



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


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


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

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

95 名前:おながいします [2007/06/06(水) 13:29:35 ID:iKhV2zih]
上の>>94ですが、使用言語はPHPです。

96 名前:nobodyさん mailto:sage [2007/06/06(水) 13:41:59 ID:???]
それは、「\12,1232,32」みたいなのははじきたいの?

97 名前:nobodyさん mailto:sage [2007/06/06(水) 13:49:54 ID:???]
「正規表現 カンマ」とかでぐぐってみると・・・

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

99 名前:nobodyさん mailto:sage [2007/06/06(水) 15:08:26 ID:???]
>>98
つ[ www.google.co.jp/search?hl=ja&q=%E9%87%91%E9%A1%8D%E3%80%80%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE&lr= ]

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

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


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

103 名前:nobodyさん mailto:sage [2007/07/10(火) 01:52:51 ID:???]
>>012
[A\d]\d{4}

とか。
あと「教示」な。




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

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

105 名前:nobodyさん mailto:sage [2007/07/14(土) 04:11:15 ID:???]
mb_ereg って戻り読み使えなかったんだっけ?

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


106 名前:nobodyさん [2007/07/20(金) 05:15:36 ID: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さん mailto:sage [2007/07/20(金) 05:26:31 ID:???]
久しぶりに実体参照の地雷を踏みまくってる投稿を見た。

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

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


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

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

111 名前:nobodyさん mailto:sage [2007/07/20(金) 13:08:08 ID:???]
って>>106読んでなかった。>>109に同感。
それじゃあどこからどこまで切れば良いのかわからない。

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

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

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

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


113 名前:nobodyさん mailto:sage [2007/07/21(土) 02:45:37 ID:???]
つまりタグの定義は
<[^>]*>
ということですね。



114 名前:106 [2007/07/21(土) 08:55:35 ID:VYWED9XA]
>>113
左様です。


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

116 名前:nobodyさん [2007/07/21(土) 13:10:23 ID:7GHIEbSO]
PHPで
localhost/index.htm
https://localhost/index.htm
test.com/index.htm
から
/index.htm
/index.htm
/index.htm
これを出力したい場合

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




117 名前:たけもー [2007/07/27(金) 23:18:07 ID:boPeFaxI]
PHPです。

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

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

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


119 名前:たけもー [2007/07/28(土) 15:25:04 ID:9w1k0jgB]
PHPです。

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

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


120 名前:nobodyさん mailto:sage [2007/07/28(土) 15:37:30 ID:???]
文字コードとかどうなっとるん?

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

122 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 01:50:43 ID:???]
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 名前:たけもー [2007/07/30(月) 07:40:51 ID:DqqhKvmn]
解決いたしましたw
ありがとうございますw



124 名前:たけもー [2007/07/30(月) 21:23:25 ID:TD8Lc2Id]
解決したはずが・・・

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

どうしてでしょうか?

125 名前:nobodyさん mailto:sage [2007/07/30(月) 23:11:52 ID:???]
原因知ってるけど正規表現に何の関係が

126 名前:nobodyさん mailto:sage [2007/07/30(月) 23:54:01 ID:???]
>>125
誘導してやってくれ。(PHPわからん)

127 名前:nobodyさん mailto:sage [2007/07/31(火) 01:38:26 ID:???]
ちなみにPerlも同じだから。正規表現は関係ないけどね。

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

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

www.google.com/search?sourceid=mozclient&ie=utf-8&oe=utf-8&q=utf8+%E5%A4%89%E6%8F%9B+%E5%85%A8%E8%A7%92%E3%83%9E%E3%82%A4%E3%83%8A%E3%82%B9+%E5%8C%96%E3%81%91%E3%82%8B

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


129 名前:nobodyさん mailto:sage [2007/07/31(火) 02:24:36 ID:???]
△▲ WebProg 初心者の質問 Part15 ▼▽
pc11.2ch.net/test/read.cgi/php/1169725490/

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

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

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

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

131 名前:nobodyさん mailto:sage [2007/08/10(金) 10:29:11 ID:???]
ホスト数が少ないなら列挙すりゃいいんじゃね。
(xxx.example1.jp|xxx.example2.jp|xxx.example3.jp)

132 名前:nobodyさん mailto:sage [2007/08/10(金) 13:25:55 ID:???]
ありがとうございます
なるほど…ひとつをピンポイントで指定する場合は
正規表現というのを使わなくても良いという事なのでしょうか…
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さん mailto:sage [2007/08/10(金) 18:16:54 ID:???]
>>132
そのものずばりというのも正規表現の一種だよ。
 a00abcd1.kngwnt01.ap.so-net.ne.jp
というのも正規表現だよ。

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

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

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



134 名前:nobodyさん mailto:sage [2007/08/10(金) 22:15:38 ID:???]
>>133
どうもありがとうございました!大変参考になりました
というかこれを機会にちょっと勉強してみます…
ありがとうございました

135 名前:nobodyさん [2007/08/11(土) 01:30:22 ID:2Sf3pkhN]
.*

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

136 名前:nobodyさん mailto:sage [2007/08/11(土) 02:02:02 ID:???]
.+ 1文字以上の任意の文字列
.* 0文字以上の任意の文字列
で最初から違ってましたね
ナハハ…

137 名前: ◆xIL6SyuS5U mailto:sage [2007/08/11(土) 02:39:04 ID:???]
a

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

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

140 名前:nobodyさん mailto:sage [2007/08/14(火) 23:03:21 ID:???]
>>139
3.3以上っていう決まりだけならどうかけますかね?
3.2があてはまらなければ大丈夫なんですが。

141 名前:nobodyさん mailto:sage [2007/08/15(水) 00:01:44 ID:???]
/\A(?:(?:[1-9]\d+|[4-9])(?:\.(?:[1-9]\d*|0))*|3\.(?:[3-9](?:\.(?:[1-9]\d*|0))*))\z/

142 名前:nobodyさん mailto:sage [2007/08/15(水) 00:28:29 ID:???]
3.10 も 3.20 も蹴っていいの?

143 名前:141 mailto:sage [2007/08/15(水) 01:17:11 ID:???]
うわボケてたアルよ。

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



144 名前:nobodyさん mailto:sage [2007/08/15(水) 22:05:09 ID:???]
>>141
ありがとー!ちょっと見てみます!

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


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

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









[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<179KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef