トップページ⇒php
1001コメント313KB

正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん03/11/19 21:42ID:Kst3Nn4S
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

註:& や " を書くときには、&amp " と描いておきましょうね。

Perlメモ
 http://www.din.or.jp/~ohzaki/perl.htm
正規表現メモ
 http://www.kt.rim.or.jp/~kbk/regex/regex.html
Regex::Diagram.pm
 http://www.cc.rim.or.jp/~midorin/mad-p/RegexDiagram.html
正規表現
 http://www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/PRC2kRegex/
UNIX正規表現入門 目次
 http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html
Regular Expression(Riue ちゃんの正規表現講座) - Index
 http://www.sixnine.net/regexp/

ほとんどは↓のリンク集にまとまっています。
正規表現最新リンク集2002
 http://www2.famille.ne.jp/~akio1998/l_grep.html

過去スレ
正規表現道場@2ch
 http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
 http://pc2.2ch.net/test/read.cgi/php/1038146241/
0951nobodyさん05/01/08 19:29:22ID:???
>>948
実はHTMLタグの削除と正規表現は相性が悪かったり。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq9.html#How_do_I_remove_HTML_from_a_stri

それでもやるとしたら、
$str =~ s/<a\s[^>]*?>(.*?)<\/a>/$1/ig;
ぐらいかな。
一部が残るのは分からない。
0952nobodyさん05/01/08 19:49:31ID:/O5s2fue

http://rinristarin.value-net.net/22/fir/ リリカちゃんが


     エッチしたら更新する日記。最近ずっとこの子に萌えっす。

                俺ともお願いぃぃ・・・

0953nobodyさん05/01/08 20:06:53ID:???
>>948
<A>タグが残ってるという理由じゃないだろうな
0954nobodyさん05/01/08 21:06:07ID:???
タグ間のテキストを抽出しないのなら開始タグ、終了タグを無視して削除するとか。
0955nobodyさん05/01/09 10:04:16ID:???
splitで最初の「:」だけで区切るにはどんな正規表現使えばいい?
@data = split(/:/, $str);
だと、余分な区切りまで・・・
0956nobodyさん05/01/09 10:17:30ID:???
@data = split(/:/, $str, 2); じゃなかったかな。
0957nobodyさん05/01/09 10:32:46ID:???
性器表現ならこうか
@data = $str =~ m/^([^:]*):(.*)/;
0958nobodyさん05/01/09 15:20:06ID:???
>>954
それだね。

s/<\/?a(\s[^>]*)?>//ig

これぐらいでもいいかも。
0959nobodyさん05/01/11 22:33:00ID:nnjmq/8Z
apacheの httpd.conf弄りたいんですが、
http://*.hoge.jp/
ってどうやって書くんでしょう?書籍とかと数時間格闘しましたが
ぱっさり理解できないのです
0960nobodyさん05/01/11 22:40:20ID:???
>>959
もっと具体的に。
0961nobodyさん05/01/11 22:42:43ID:???
とてもスレ違いな悪寒
0962nobodyさん05/01/12 00:48:18ID:mmvJMOP+
例えば

文字列 = "例えば(その1)や(その2)など";

で( )の中身をとりたいんすけど素直に"/\((.+)\)/"とすると
"その1)や(その2"がマッチしてしまいます。
"/\(([^\(]+)\)/"とすると"その1"しかマッチしてくれません。
whileを使ってもうまくいきません。どのようにしたらいいでしょうか。
phpでpreg_matchしています。
0963nobodyさん05/01/12 00:56:34ID:???
"/\(([^)]+)\)/"の間違いじゃないのか
そしてpreg_match_allの間違いじゃないのか
0964nobodyさん05/01/12 00:58:27ID:???
つーか"/\((.+?)\)/"でOKか
096596205/01/12 01:10:13ID:???
963さん、964さんありがとうございました。
それでいけました。
使ってるリファレンス本にpreg_match_allがのってなかったので気付きませんでした。
きちんとマニュアル読むようにします。
096695905/01/12 13:29:58ID:o9KFPT4S
レスありがとうございます。

直リンクを防ぐために
httpd.confを次のように弄ったのですが、
上手く動作しませんでした。
サブドメインからのアクセスなら、
サブドメインが何でも、直リンクにはならないように設定したいのです。
自宅サーバー板で正規表現を勉強しろ、とのコメントをいただいて、
悪戦苦闘してるんですが、パッサリ理解できないのでございます。

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://*\.hogehoge\.jp/.*$ [NC]
RewriteRule ^(.*)$ - [F]
これは動きませんでした。

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://abc\.hogehoge\.jp/.*$ [NC]
RewriteRule ^(.*)$ - [F]
こっちは正しく動作しました。
0967nobodyさん05/01/12 14:01:55ID:???
> !^http://*\.hogehoge\.jp/.*$

*は直前の文字が0以上繰り返される、という意味なので、上の式がマッチするのは
http://.hoge . . .
http:////.hoge . . .
http:///////////////////////////////////////////////.hoge . . .
など。

どんな文字でもマッチさせるには、「.」の0もしくは1以上の繰り返し、と書けばいいんだが、
あらゆるパスにマッチする正規表現はかけてるのに、あらゆるサブドメインにマッチする
正規表現が書けないとはこれいかに。
0968nobodyさん05/01/12 14:04:36ID:???
>>966
正規表現で「 * 」は「直前の文字や正規表現を 0回以上繰り返す」という意味なので、
上の例の「 /* 」の箇所で「 / を 0回以上繰り返す」という意味になっちゃってる。
おそらくそこでやりたいのは「アルファベットを 1回以上繰り返す」だと思うので、
「 !^http://[a-z]+\.hogehoge\.jp/.*$ 」とすればいいんじゃないかな。
「 + 」は 1回以上繰り返す意味。
0969nobodyさん05/01/12 15:11:10ID:1iafFrJp
<a name="a193"></a><dt>
<span class="2ch_number">193</span> :
<span class="2ch_name">以下、名無しにかわりましてVIPがお送りします</span>:
<span class="2ch_date">05/01/12 13:43:10 ID:Zzzz4wKL</span></dt>
<dd>
<a href="http://jumpres/read.cgi/news4vip/1105500214/183"><a href="http://jumpres/183">>>183</a></a>
のレスをよく見ていえよ
<a href="http://jumpres/read.cgi/news4vip/1105500214/187"><a href="http://jumpres/187">>>187</a></a>! <br><br></dd>


↑のこういう一行(長いから改行してるけど)から>>999の左右にある<a></a>を外すっていうのをやりたいです。
どうしたらいいですか?
0970nobodyさん05/01/12 15:18:40ID:???
>>999をサブパターンにとって、リンク全体をそれに置換してやればOK。
つかアンカータグのネストなんかぶっちゃけありえない
097195905/01/12 15:19:29ID:???
>>967-968
ありがとうございます。
教えていただいたhttp://[a-z]+\.hogehoge\.jp/.*$
で上手く行きました。
本当に助かりました。感謝感激です
0972nobodyさん05/01/12 17:23:47ID:???
>>969
アンカータグ全部要らない、ってことなら、
何も考えずにとにかく <a ...> と </a> を取り除いちゃえばええのでは。
0973nobodyさん05/01/13 20:32:10ID:rZkv4VMu
abcdefg{__hoge__}hijklmn
のような文字列の
{__hoge__}とカッコ等が付いたものと、hoge と文字のみの2つを取得したく
以下のようにしてみました。

preg_match_all("/\{__(.+)__\}/","$str","$match");

一行に {__(.+)__} 形式の文字が一つしかない場合は、上手くいくのですが
二つ以上あるばあい、{__hoge__}{__piyo__} と最大のマッチをしてしまいます。
最小のマッチをさせるには、どうすればいいのでしょうか?
0974nobodyさん05/01/13 20:44:16ID:???
>>973
preg_match_all("/\{__(.+?)__\}/",$str,$match);
097597305/01/13 22:43:11ID:???
>>974
ありがとふ。
やっぱりそれか。出来てたのに見落としてしまっていた orz
0976nobodyさん05/01/15 14:08:23ID:DsGxQZIF
Perlで、引数としてファイル名を受け取った場合に(例えば ./test.pl)、そのファイルが
あるとされるディレクトリ(例でいう./)を調べて、そのファイルがあるかどうかをチェック
したいのですが、引数のファイル名最後のスラッシュ以後を消す方法が分かりません。

どういった正規表現を用いれば良いのでしょうか?
0977nobodyさん05/01/15 14:56:01ID:???
>>976
そんなことで正規表現を使ってどうするよ。
「ファイルテスト演算子」でぐぐれ。
0978nobodyさん05/01/17 03:16:40ID:???
>>976
ファイルテスト演算子とは知りませんでした(死

ところで、その引数から、拡張子とディレクトリ構造?(./、../、/)を消して
ファイルの名前だけを知りたいのですが、(./ディレクトリ名/**.txtでいう**)
そういう時は以下みたいに3段かませばいいですか?

$name = "./test/test.txt";
$name =~ s/\A\.|\A\.\.//g;
$name =~ s/\A\/|\A\/\S*\/|\S*\///g;
$name =~ s/\.\S*$//g;

うまく取得できない例外は起きそうでしょうか?
0979nobodyさん05/01/17 03:36:56ID:???
そんなに何行も書くほどのことじゃない。

ファイル名を取り出したいなら
$name = "./test/test.txt";
$name =~ /.+\/(.+)/;
print $1;

test.txt

ファイル名のみに置き換えたいなら
$name =~ s/.+\/(.+)/$1/;
$name = "./test/test.txt";
print $name;

test.txt
0980nobodyさん05/01/17 04:07:56ID:???
ふつー File::Basename じゃね?
0981nobodyさん05/01/17 07:42:04ID:???
>>980
"正規表現道場"
0982nobodyさん05/01/17 09:08:29ID:???
>>980
次スレを
098398005/01/17 11:48:08ID:???
>>981
正規表現を使うのが適切でないときに「正規表現を使うな」と指摘するのは
"正規表現道場" にふさわしくないと?
098498005/01/17 11:53:51ID:???
>>982
立てますた。

正規表現道場@2ch Part4
http://pc5.2ch.net/test/read.cgi/php/1105930285/
0985nobodyさん05/01/17 15:42:34ID:???
>983
ネタごとに補足、でいいのかな
0986nobodyさん05/01/18 06:55:18ID:???
>>983
正規表現じゃない方が楽なら、
そっちを教えてあげるのが
優しいお兄さんとしての役割。
正しい誘導をしてあげていると思います。
0987nobodyさん05/01/19 06:32:23ID:???
>>986

        て
        ん
          し
0988nobodyさん05/01/19 08:19:55ID:???
    じゃ 
     え 
     さ 
     を 
0989nobodyさん05/01/20 02:09:00ID:???
require  "http://pc5.2ch.net/php/";
&1105930285;
0990nobodyさん05/01/20 12:41:11ID:???
990
0991nobodyさん05/01/20 12:56:21ID:???
バカが立てた糞スレタイともやっとおさらばか
0992nobodyさん05/01/20 12:57:20ID:???
ばかっていうな!
0993nobodyさん05/01/20 13:05:58ID:???
ばかなんて言ってないだろう。
バカって言ったんだよ、バーカ。
0994nobodyさん05/01/20 13:16:13ID:???
ヽ(冫、)ノズコーッ
0995nobodyさん05/01/20 13:17:39ID:???
おさらばかキタ━━━━━━(゚∀゚)━━━━━━ !!
0996nobodyさん05/01/20 13:21:36ID:???
>>995
ばかっていうな!
0997nobodyさん05/01/20 13:31:15ID:FNQvtzHY
997
0998nobodyさん05/01/20 13:51:09ID:???
バカよ、さらば!
0999nobodyさん05/01/20 13:55:38ID:???
999
1000nobodyさん05/01/20 13:55:54ID:???
1000げっとでちゅー
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。