正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/11/19 21:42ID:Kst3Nn4Sこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
註:& や " を書くときには、& " と描いておきましょうね。
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/
0385nobodyさん
04/04/21 23:45ID:???これをPHPで使うにはどう変更すればいいでしょうか?
preg_replace関数を使ってみたのですが、マッチしてくれませんでした。
0387nobodyさん
04/04/22 06:41ID:???$str = '<a href=http://bbq.2ch.net/bbynews/i/>速報Headline</a>';
$result = preg_replace('/(<\w+\s+href\s*=\s*)([\'"]?)([^\2\s>]*)\2(\s*>)/i', '$1"$3"$4', $str);
こんなのでいけた。
うまくいきました。ありがとー
条件を " でくくっててマッチしないのを、 ' に変更したらできました。
0389nobodyさん
04/04/28 11:02ID:YDy2pcOHsub/test.htmから<n月>という文字列がある行をマッチさせたいのですが、下のようにすると
ローカルではマッチするんですが、サーバーに上げるとマッチしなくなります。
print "content-type: text/html\n\n<html>";
open(TEST, "sub/test.htm");
while (<TEST>) {
if ($_ =~ /<.*?月>/) {print $_;}
}
close(TEST);
print "</html>";
exit;
4行目を
if ($_ =~ /<(.*?)月>/) {print $_;}
に書き換えるとローカルでもサーバー上でもマッチします。なぜでしょうか。
0390nobodyさん
04/04/28 13:08ID:???「ローカル」と「サーバー」のそれぞれの Perl のバージョンは?
スクリプトと sub/test.htm のそれぞれの文字コードは?
0391389
04/04/29 02:51ID:SDhjA2B7ローカルは5.8.3でサーバーは5.6.1です。
ファイルの文字コードはシフトJISです。
0392nobodyさん
04/04/29 02:56ID:AOm5G2zY0393nobodyさん
04/04/29 15:34ID:cR/VctPCのような文字列に対して、imgタグやbrタグだけ残して、他の<>"'&あたりを文字参照に置換
したいんですが、正規表現一撃でいけますか?
0394nobodyさん
04/04/29 15:38ID:???0395nobodyさん
04/04/29 15:46ID:???文字参照→文字実体参照
上の例だと
適当な文字列<img src="ダブルクォーテーションを含まない文字列">適当な文字列<br>適当な文字列<適当な文字列"適当な<br>文字列
となって欲しいのです
0396nobodyさん
04/04/29 16:02ID:???0398nobodyさん
04/04/29 18:44ID:???0399nobodyさん
04/04/29 19:01ID:???0400nobodyさん
04/04/29 19:06ID:???その程度のことgoogleで調べろよ
0403nobodyさん
04/04/29 20:44ID:???WindowsXP SP1
ActivePerl 5.8.0.806
正規表現でカタカナの「ゼ」を使うとエラーになってしまいます。
カタカナのゼを含む場合だけ「Unmatched [ in regex;」というエラーで止まってしまい、ほかの文字は大丈夫そうなのですが、対処法ありませんか?
if($temp =~ /ゼ/){
色々;
}
0404nobodyさん
04/04/29 20:51ID:???そんなバカなと思いつつ確認完了。
なぜだろう。
>>393
できるかも知れないけど、プログラム書いたほうが楽だと思う。
>>396
http://www.w3.org/TR/html401/charset.html#h-5.3.2
0405nobodyさん
04/04/29 20:59ID:???ttp://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
if($temp =~ /\Qゼ\E/){
0406nobodyさん
04/04/29 21:11ID:???ありがとうございます。
とりあえず意図した動作をするようになりました。
文字コードのせいで [ に認識されていたんですね。
紹介していただいたURLもブックマークしました。
熟読しますね。
0407nobodyさん
04/04/29 23:02ID:???my $attr = qr/\w+=(?:(?:(')|(")|([^>]))(?:(?(2)[^']*)(?(3)[^"]*)(?(4)[^\s>]*))(?:(?(2)')(?(3)"))\s*)?/;
my $amp = qr/&(?!(?:(?:\#\d+)|(?:\#x[a-f\d]+)|(?:\w+));)/i;
s/(<\/?\w+\s*(?:$attr)*>)|(<)|(>)|(")|($amp)/
$1 and $1 or $5 and '<' or $6 and '>' or $7 and '"' or $8 and '&'
/xge;
Perlで書いてみたけど、どこか穴があるかも。
0408nobodyさん
04/04/29 23:05ID:???$1 and $1 or $5 and '<' or $6 and '>' or $7 and '"' or $8 and '&'
0409nobodyさん
04/04/30 06:46ID:???> http://www.w3.org/TR/html401/charset.html#h-5.3.2
なるほど。では、タグ外で"とかまで変換しても害は無いですね。
0410393
04/05/03 22:32ID:???しかし内容を理解しようとしてみたが、いまだわかりません。
簡単なhtmlパーサを作っていて、<br>と<img>はインライン要素で、閉じタグもない
から、他の処理がすべて終わった後に置き換えればいいや、というロジックでした。
よく考えたら、文字列中に実体参照で<>が出てきたとしても、&が&に展開
されるので、いちど実体参照に展開してから、すべての処理が終わった後に、
s/<br>/<br>/i
s/<img src="([^"<>]*)">/<img src="$1">/i
これでいけました。
いろいろテストしていたので、反応が遅くてすまんです。
0411393
04/05/03 22:39ID:???それと、お世話になりましたので、ヘタレの作ったhtmlパーサでも見てやろうかという
方がいるならアプロダにでもソースさらします。
0412nobodyさん
04/05/03 23:52ID:???0413393
04/05/04 00:09ID:???HTML::Parseモジュールの使い方を理解するのが面倒くさかった
&
掲示板の投稿に特定のタグと属性のみ許可する、文法に従わないタグは
その旨マークしてテキストとして表示する、という限定的用途なので、自作
のほうが汎用モジュールより高速だと思った
&
Perlと正規表現の勉強のため
て、感じで。
0414nobodyさん
04/05/04 01:54ID:???実用には不向きなので。
0415nobodyさん
04/05/05 18:30ID:???名無しさん@ゴーゴーゴーゴー! :04/04/14 17:58 ID:WE3vDaf0
愛と荒らしの掲示板:http://bbs2.otd.co.jp/16588/bbs_plain
が痛い。荒らし依頼すっと、IPアドレス晒される
依頼か (?)要注意。あまりの痛さにPCを殴りたくなった。
今度は「愛と臨時の掲示板」だってさ!痛すぎる馬鹿だな!
http://bbs10.otd.co.jp/286214/bbs_plain
逃げても無駄だぜ!ゲロ!!つーかお前馬鹿?
卑怯者!逃げるなよ、潜伏中か?
愛と荒らしの掲示板(逃亡先):http://bbs10.otd.co.jp/286214/bbs_plain
0416未承諾広告※ ◆TWARamEjuA
04/05/05 18:55ID:???0417nobodyさん
04/05/06 22:18ID:???/^0?[0-3]?[0-7]{1,2}$/ってどんな意味ですか?
0418nobodyさん
04/05/06 23:08ID:???0419nobodyさん
04/05/07 00:17ID:???0420nobodyさん
04/05/09 00:57ID:R8gJ7rV0にはどうしたらいいでしょうか。
$_ =~ s/表/表\/g;
みたいなことをしたいんですが上記の場合「表」のコードが(95 5C)なのでエラーに
なってしまいます。コードのまま検索かけてもうまくいきませんでしたし
$_ =~ s/95 5C/95 5C 5C/g;
どうすれば「表」という一文字を検索に引っ掛ける事ができるでしょうか?
0421420
04/05/09 01:29ID:???$_ =~ s/\x95/表\/g;
でも\x95だけでは他の文字にも影響が出てしまいますよね。それで
$_ =~ s/\x95\x5C/g;
としてみましたがこれではマッチしてくれませんでした。どうすればいいでしょうか。
0422nobodyさん
04/05/09 01:45ID:???出力だけでなく処理もSJISでやってるなら展開しないように工夫すれ
0423nobodyさん
04/05/09 02:02ID:???0424420
04/05/09 02:08ID:???はい。フォームに入力してもらった文字列をオウム返しに次のページに出力したり
内容をsendmailで送ったりの時に文字化けが起こらないようにしたいんです。
ところで、みんなはクエリは受け取ったらeucに変換して処理をした後、出力時にsjis
に変換しているのですか?
プラットフォームがwinならsjisで、unixならeucに変換して扱うみたいな事を聞いたの
ですが、winでも処理時はeucで出力の時にsjisに変換すれば大丈夫なんでしょうか?
0425nobodyさん
04/05/09 02:16ID:???http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0426nobodyさん
04/05/09 02:18ID:???HTMLをEUCで書く
PerlCGIをEUCで書く
「表」とかで悩んだことは一度も無し。
ほんとみんな無駄な苦労してるなあと思ってる。
HTMLがShift_JIS指定されてたら、最初にEUCに変換してから処理してる。
(変換時にはちゃんとincode=sjisを付ける)
0427420
04/05/09 02:39ID:???も自動的にShift_JISで書いてました。何かエディタを使おうと思いますが、色付けもなく
特定文字が太字にもならない、メモ帳と違うのは漢字コード指定で再読み込みができる
っていう感じのはないんですかね。一応terapadは持ってるんですが、色はよくても
太字になるし、たまに挿入モードから勝手に上書きモードになっちゃうしで、使いづらいんですよね。
>>426
>HTMLがShift_JIS指定されてたら、最初にEUCに変換してから処理してる。
ここらへんが不安だったのでeucで書くのをためらってるのですが、htmlやperlを書くときに
エディタを使ってeucで書くと、ブラウザ側がシフトJISの時に文字化けしますよね?
〜最初にeucに変換してから処理する〜の意味が理解できなくて・・・
>>425のサイトとperlメモを流し気味で読みましたが、ちゃんと読めば上記についても
解説されてるのでしょうか?
とりあえずお腹が空いたので、お茶漬けでも食べます。
0428nobodyさん
04/05/09 03:08ID:???> はい。フォームに入力してもらった文字列をオウム返しに次のページに出力したり
> 内容をsendmailで送ったりの時に文字化けが起こらないようにしたいんです。
そこでなんで $_ =~ s/表/表\/g; みたいな処理が必要なの?
0429420
04/05/09 03:48ID:???中に表が入っているか検索して、入っていたら表の後ろに\をつけて問題を解決しようと
思ってましたが、sjisでやること自体が間違いみたいですね。
ところでこれはスレ違いな質問なんですが、エディタを使う事にしたのでファイルの関連付けをメモ帳の部分を
全て変えたのですが、HTMLページのソースを開くときに何故かメモ帳が起動してしまうのですが
どうしてでしょうか。
0430420
04/05/09 04:05ID:???>(変換時にはちゃんとincode=sjisを付ける)
perlをeucで書く場合(HTMLがShift_JIS指定されてる場合),
print "文字列";
を
$data="文字列";
jcode::convert(\$data,"sjis");
print $data;
としなくてはならないのですか?ってこれも凄いスレ違いですね。こうゆう事はどこのスレに行って
質問すればよいでしょうか。
0432nobodyさん
04/05/09 04:38ID:???> っていう感じのはないんですかね。一応terapadは持ってるんですが、色はよくても
> 太字になるし、たまに挿入モードから勝手に上書きモードになっちゃうしで、使いづらいんですよね。
「勝手に」なるんだったら使えないな。素人の言い訳みたいだな。
> ここらへんが不安だったのでeucで書くのをためらってるのですが、htmlやperlを書くときに
> エディタを使ってeucで書くと、ブラウザ側がシフトJISの時に文字化けしますよね?
普通ブラウザ側の表示文字コードは自動判別になっている。
自動判別に失敗するのを防ぐためのContent-Typeだ。(IEはContent-Typeは見ないんだったっけ?
> >>425のサイトとperlメモを流し気味で読みましたが、ちゃんと読めば上記についても
> 解説されてるのでしょうか?
ちゃんと読んでから何か発言してください。
>>429
> 全て変えたのですが、HTMLページのソースを開くときに何故かメモ帳が起動してしまうのですが
> どうしてでしょうか。
窓の手入れろ
0433nobodyさん
04/05/09 04:40ID:???> >HTMLがShift_JIS指定されてたら、最初にEUCに変換してから処理してる。
> >(変換時にはちゃんとincode=sjisを付ける)
> perlをeucで書く場合(HTMLがShift_JIS指定されてる場合),
> print "文字列";
> を
> $data="文字列";
> jcode::convert(\$data,"sjis");
> print $data;
確かにそうしなければならないが、俺はそれは嫌だからプログラム内に日本語は書かない。
そもそもプログラム内にprintがない。
HTML::Template Template-Toolkit Template:Extract
0434420
04/05/09 05:03ID:???色々ためになるアドバイスありがとうございました。
>>433
参考にします!ほんとに感謝です。
それでは失礼します。
0435nobodyさん
04/05/11 15:44ID:g6OxcqtT文字列 a=A b="B" c="C d=D" e に対して、
a=A
b="B"
c="C d=D"
e
が出てくるパターンを教えてくださいませ。
之では駄目みたいなんです → /(\w\=(\w|\"\w\")|(\w))/
0436nobodyさん
04/05/11 16:11ID:???0437436
04/05/11 16:15ID:???0438435
04/05/11 16:26ID:???0439nobodyさん
04/05/24 16:10ID:yOpX2XMb$dataにはhtmlがごちゃごちゃ入っているとします。例えば
$data =
"<p>\n".
" ほげれ\n".
"</p>\n".
"<pre>\n".
" ここは整形済み\n".
"</pre>";
この$dataを他のhtmlに埋め込むプログラムをつくりました。
そのとき、埋め込んで完成したhtmlのソースが見づらいため、
埋め込む$dataの各行にインデントを加え、埋め込み先のhtmlソースと
幅を合わせます。
$data =~ s/\n/\n /g;
という正規表現で、各行の改行の後ろに次行のインデントを加えてみました。
ところがこの場合、preの中身にも当然インデントが入ってしまい、困っています。
preの中はインデントをかけたくありません。
どういう正規表現で書けばいいでしょうか。
速度はあまり気にしませんが。遅くてもいいので1行の正規表現で書きたいです。
プラットフォームはperl5.8によるCGIです。
0440nobodyさん
04/05/25 01:23ID:???一行は無理だと思う。
0441未承諾広告※ ◆TWARamEjuA
04/05/25 11:33ID:???my $Indent = "\t";
my $data =<<"HTML";
<p>
ほげれ
</p>
<pre>
ここは整形済み
</pre>
HTML
$data =
eval {
my $flag;
join '',
map {
$flag++ if m|<pre>|i;
$_ = $flag ? "$_\n" : "$Indent$_\n" ;
$flag-- if m|</pre>|i;
$_;
} split /\n/, $data;
};
print $data;
眠たいのでごちゃくちゃ、、、スマソ
0442nobodyさん
04/05/25 13:24ID:???0443439
04/05/25 17:16ID:???このコードを眺めて精進します。本当にありがとうございました。
0445nobodyさん
04/05/25 20:15ID:???0446nobodyさん
04/05/30 02:31ID:d8FeFDnu文字列は 'YYYYMMDD-hhmmss', 'YYYYMMDD' の二種類がマッチして、
前者は YYYYMMDD と hhmmss を、
後者は YYYYMMDD と '' (空) を取得したいと思います。
/(\d{8})-(\d{6})/ では後者で取得できませんでした。
どなたかパターンを教えてくださいませ。
0447nobodyさん
04/05/30 02:35ID:???0448nobodyさん
04/05/30 02:47ID:???しかしながら、取得した配列が
前者が YYYYMMDD-hhmmss YYYYMMDD -hhmmss hhmmss
後者が YYYYMMDD YYYYMMDD '' ''
となってしまいました。
欲しいものは
YYYYMMDD-hhmmss から取得したのが YYYYMMDD-hhmmss YYYYMMDD hhmmss
YYYYMMDD から取得したのが YYYYMMDD YYYYMMDD ''
なのです
文を追加することで簡単に直せるのですが、パターンで解決できましたら、
よろしければ後学の為にも教えてくださいませ。
0449nobodyさん
04/05/30 02:50ID:???0452nobodyさん
04/06/04 17:11ID:5ERN6S7Jhttp://www.example.com/aaa/bbb/ccc/foo/bar/
または
http://www.example.com/aaa/bbb/ccc/foo/bar
の「bar」(つまりスラッシュ区切りの一番最後の文字列)
を、$1に格納して、/index.php?cat=$1 [L] を表示するにはどうしたらよいのでしょうか?
試しに以下のようにやっても、404になってしまいました。
RewriteRule (^/+)/?$ /index.php?cat=$1 [L]
どうすれば良いのでしょうか?
0453こうかな?
04/06/04 17:38ID:???0455nobodyさん
04/06/21 10:56ID:DV/+bk/n>>1のリンク先を見たのですが、素人&理数系全くダメの私には理解できませんでした・・・
どなたかアドバイスを下さると嬉しいです。
1-1001までの数字を
1→<a name="1">1</a>
・
・
・
1001→<a name="1001">1001</a>
というふうに置換したいのですが、
検索:[0-9]\f|[0-9]\f[0-9]\f|[0-9]\f[0-9]\f[0-9]\f|[0-9]\f[0-9]\f[0-9]\f[0-9]\f
置換:<a name="\0">\0</a>|<a name="\0\1">\0\1</a>|<a name="\0\1\2">\0\1\2\</a>|<a name="\0\1\2\3">\0\1\2\3</a>
とやっても上手くいきません。(↑笑わないでくださいね。これでも必死なんです・・・)
エディタは秀丸です。どうかよろしくお願いします。
0456nobodyさん
04/06/21 13:16ID:???きっとこんなんじゃ駄目なんだろうな。
0457455
04/06/21 13:20ID:???[0-9]+\f →<a name="\0">\0</a>
これで出来るようになりました。
今度からもっと調べてから書き込みますね。
スレ汚し失礼しました。
0459nobodyさん
04/06/23 14:38ID:StfIGGBa上記の文字列から'test2'の部分だけを取り出したいのですが、
'm /<tag>(.*?)<\/tag>/;' では$1に 'test1<tag>test2' まで入ってしまいます。
'm /<tag>.*?<tag>(.*?)<\/tag>/;' で望みどおりにはなるのですが
エレガントではないように思います。
もっと良い表現はないでしょうか?
0460nobodyさん
04/06/23 15:40ID:???0461460
04/06/23 15:57ID:???0463nobodyさん
04/06/23 18:16ID:???(03/11/19) http://snapshot.publog.net/html/php/2003/11/19/214238.html
(02/11/24) http://pc5.2ch.net/php/kako/1038/10381/1038146241.html
(01/07/26) http://pc.2ch.net/php/kako/996/996105815.html
0464nobodyさん
04/06/24 22:52ID:???http://cgi25.plala.or.jp/~c6h6/em_wiki/index.php?%C0%B5%B5%AC%C9%BD%B8%BD%B7%C7%BC%A8%C8%C4
0465nobodyさん
04/06/25 11:54ID:g4l68VjTと言う文字列があったとして、'B'の2個目の後ろの数字とか、
'A'の3個目の数字などの指定はどうしたら良いでしょうか?
Perlでお願いします。
{m回目にマッチ}を使えば良いかと思ったのですが、使いかたがわかりません。
0466nobodyさん
04/06/25 12:01ID:g4l68VjTm /.{3}(\d)/;
とかで'B'の2個目の後ろの数字は取り出せるのですが、
'A'や'B'はhtmlのタグの変わりですので、任意の文字列の
希望するヒット回数の後ろの文字列を取り出したいと思っています。
0468nobodyさん
04/06/25 12:20ID:???/.*B.*B(\d)/
とかやるしかないんじゃないの?
0469nobodyさん
04/06/25 12:25ID:g4l68VjThtmlの中の2個目のtableタグの中の文字列を取り出したり、
3個目の画像のURLを取り出したりしたいです。
>>468
>つか、{m}はm回数目にマッチじゃないからね。
ご教授ありがとうございます。
0471468
04/06/25 12:36ID:???/(?:.*?B){m}(\d)/
……でもこれってHTML解析とは違うような気がする。
0472nobodyさん
04/06/25 12:46ID:g4l68VjT2個目の<tabe></table>内の10個目の<td></td>の間の文字列を取り出したいのですが、
エレガントな表記方法をお願いします。
>>471
まだまだ初心者なので的確な表現ができなくて申し訳ありません。
自分で調べるとっかかりが欲しかったので、>>465のような質問にしました。
0474nobodyさん
04/06/25 13:15ID:???>>472
そのくらい複雑なことするようなら HTML パースライブラリ使った方が吉。
0475nobodyさん
04/06/25 13:31ID:g4l68VjTぐたい-てき 0 【具体的】
一般的なものや観念的なものではなく、個々の事実によっているさま。
「―に例をあげる」
具体的に例をあげているだろうが。
具体的という意味がわからないならもう帰っていいよ
>>474
>そのくらい複雑なことするようなら HTML パースライブラリ使った方が吉
ご教授ありがとうございます。
HTML パースライブラリというのを知っただけでも大きな収穫を得ました。
0476nobodyさん
04/06/25 13:42ID:???一番必要なのは日本語の勉強だな。
0477nobodyさん
04/06/25 14:10ID:???>2個目の<tabe></table>内
<table><td><table/></td></table><table/>
どれが2個目のテーブルですか。
どこが具体的ですか。
脳内ですか。そうですか。
おめでたい頭してますね。カワイそうに。
0480nobodyさん
04/06/29 20:28ID:8D9V5eyppreg_match("/<a href=(.*)>(.*)<\/a>/i",$str,$str_reg);
これだと、<b></b>があるため、URLとタイトルがうまく抜き取れません。
http://www.abc.com/
<b>ABC</b>company
の2つを抜き出したいのですが、どうしたらいいのでしょうか?
<b>タグが入っていない場合は、うまくいくのですが…。
0483nobodyさん
04/07/03 16:46ID:3JpN2Yosや
DoCoMo/1.0/X503i/c10/ser***********
から
ser**********←これは11〜15桁のユニークな英数字
を得たい。
それと、
http://www.dp.j-phone.com/dp/tool_dl/web/useragent.php
J-PHONE/4.0/J-SH51/SN************ SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0
Ext-Profile/JSCL-1.1.0
SN************←12桁のユニークな英数字
を得たい。
よろしくお願いします。
0484nobodyさん
04/07/03 16:48ID:???SN\d{12}
■ このスレッドは過去ログ倉庫に格納されています