正規表現道場@2ch Part4
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/17 11:51:25ID:SH1ygN1Pこのスレは有用そうな正規表現を紹介したり、
どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
註:& や " を書くときには、& " と描いておきましょうね。
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/
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
http://pc5.2ch.net/test/read.cgi/php/1069245758/
003230
05/01/21 11:25:14ID:???、最後に出てきる%の文字列以降を削除する方法を教えてくださいませ
0033nobodyさん
05/01/21 11:25:24ID:???$str = '1005hw9fCDDLlBeZ0%253D';
$str = explode('%',$str,1);
var_dump($str);
で。正規表現(゚�听)イラネなときは出来るだけ使わない。
0034nobodyさん
05/01/21 11:27:07ID:???とりあえずpreg_replace('/%.*/', '', $str_o);
0035nobodyさん
05/01/21 11:29:12ID:???preg_replace('/%[^%]*$/', '', $str);
%はエスケープ不要よ。
003633
05/01/21 11:30:24ID:???訂正
$str = '1005hw9fCDDLlBeZ0%253D';
$str = explode('%',$str,2);
var_dump($str);
0037nobodyさん
05/01/22 16:28:46ID:Z5CU+gTj2
00:02:19,916 --> 00:02:21,084
I can't move!
3
00:02:24,879 --> 00:02:27,215
Help me! I can't move!
4
00:02:27,882 --> 00:02:28,591
Oh my god!
このような文字列のtxtファイルを英語の部分のみ下のように取り出したいのですが
I can't move!
Help me! I can't move!
Oh my god!
いいソフトはありますかと聞いたところ正規表現ならできると聞き、このスレに来ました。
上の条件を満たすにはどのようにすればいいのでしょうか?
0038nobodyさん
05/01/22 16:48:23ID:???「ソフトありますか」からここに来るのがいまいちよくわからんな。
正規表現の書き方が知りたいのか?
できるけど正規表現が使えるソフトかなんらかのスクリプトなどが
ないと意味ないぞ。
0039nobodyさん
05/01/22 17:04:14ID:Z5CU+gTj正規表現が使えるソフトは自分でみつけました。
あとはそこに%$?みたいな記号を入れるのですが、それがわからないのです。
0040nobodyさん
05/01/22 17:06:17ID:???grepでいいでしょ。
明らかに板違いだね。
ココから来たのかよ。
気軽に「こんなソフトありませんか?」 6
http://pc5.2ch.net/test/read.cgi/software/1104587671/695
とりあえず、放置推奨 >all
0043nobodyさん
05/01/25 07:32:45ID:???$strが漢字一文字の時マッチ。
preg_match("/^[\xb0-\xff][\xa0-\xff]$/", $str)
意図が今ひとつ分からないから、こんなもんで。
0044nobodyさん
05/01/26 10:23:23ID:???逆に囲まれているというのは出来るのですが囲まれていない方が分からないです。。。
0045nobodyさん
05/01/26 10:27:00ID:???0046nobodyさん
05/01/26 13:29:10ID:???囲まれているのができるのならば、
(1) 囲まれている<と>を適当にぶつからない文字or文字列に変換する。
制御文字とかがオススメ。
(2) 残った全ての<と>は囲まれていないのでお前の好きなように変換する
(3) (1)で変換したものを元の<と>に戻す
とすればいいはずだな。
0047nobodyさん
05/01/26 13:30:28ID:???Perl でいい?ちょっと苦しい感じもするけどこんなのとかどうでしょう?
$str =~ s/(?:(「.*?」)|(\<))/$1||"<"/ge;
$str =~ s/(?:(「.*?」)|(\>))/$1||">"/ge;
004847
05/01/26 13:33:15ID:???置換後のダブルクォーテーションの中は「&lt;」「&gt;」です。
$str =~ s/(?:(「.*?」)|(\<))/$1||"&lt;"/ge;
$str =~ s/(?:(「.*?」)|(\>))/$1||"&gt;"/ge;
0051nobodyさん
05/01/27 01:51:00ID:???変換する正規表現を書いてみました。
$sql =~ s/(\'|\\|\%)/\\$1/g;
正常に動作しているみたいなのですが、異常系のパターン
文字列等ございましたらご指摘いただきたい次第です。
宜しくお願いします。
0052nobodyさん
05/01/27 14:08:43ID:???それで特に問題ないように思うけど、
そもそもな話で、SQL のエスケープの仕様ってそれで良いの?っていうのと、
DB のライブラリにはエスケープする関数が用意されてることが多いので
そっちを調べた方が良い気がする。
0053nobodyさん
05/01/28 02:31:31ID:???ご返答有難うございます。
おそらくこの3つをエスケープすれば良いかと思うのですが、
他にもあるのでしょうかね、、
スレ違いっぽいので他のところで聞いてみます。
0054nobodyさん
05/01/28 12:52:16ID:???%a = $a =~ /([a-z])(\d)/g;
とすると
$a{a} == 1;
のようになりますが、括弧が4つの時に$2と$4だけを毎回ハッシュに渡すには
どうすればいいんですか?
%a = $a =~/(([a-z])\d)([a-z](\d))/g;
$2と$4だけを毎回%aに渡したいのです。
0055nobodyさん
05/01/28 13:08:00ID:???(?: ) で後方参照されなくなるので、こうするとか。
%a = $a =~/(?:([a-z])\d)(?:[a-z](\d))/g;
005754
05/01/28 13:50:40ID:???$html_1 = qq|<input type="hidden" name="test1" value="a">|;
$html_2 = qq|<input type="hidden" value="a" name="test1">|;
%hiddenというのの中にnameの値をキーにvalueの値を値にしたハッシュを作成したいです。
わからないのは
my %hidden = $html_1 =~ m{<input type="hidden"\s*(?:name="(.*?)")?\s*(?:value="(.*?)")?.*?>};
$html_1に対してはこれでいいですが$html_2に対してはこれではキーがありません;
nameとvalueの順番がなんでもいいようにするにはどうすればいいですか?
0058nobodyさん
05/01/28 18:09:31ID:???一発でマッチする方法はあるかなあ?俺はこんなのしか思いつかなかった。
my $params = ($html =~ m{<input\s+type="hidden"([^>]+)>})[0];
my %hidden = $params =~ m{(?:\s+(\w+)="([^"]+)")}g;
0059nobodyさん
05/01/28 22:09:22ID:???素直に 2 回マッチさせるのが無難じゃないかなぁ,こんな感じで。
my %hidden = map {/\bname="(.*?)"/, /\bvalue="(.*?)"/} $html_2, ;
0060nobodyさん
05/01/30 11:46:21ID:???my %hidden = $html_2 =~ /<input type="hidden".*?(?=.*?\bname="(.*?)").*?\bvalue="(.*?)".*?>/;
0061nobodyさん
05/01/30 16:30:48ID:???それいいなw
%hidden =
$html =~
/<input(?=.*?\btype="hidden")(?=.*?\bname="(.*?)")(?=.*?\bvalue="(.*?)").*?>/g;
こうすると type=hidden が後ろになっても取れるのかー。戴きます。
0062nobodyさん
05/01/30 19:07:48ID:60wlVefXtest.txtというファイルに
|aaaaaaaaaa|ddddddddddddd|ggggggggggggg|
|ffffffffff|hhhhhhhhhhhhh|jjjjjjjjjjjjj|
|mmmmmmmmmm|uuuuuuuuuuuuu|lllllllllllll|
というのが書かれているとします。
このファイルをUNIX上でcat test.txt | perl test.cgi
というコマンドを打ちます。
test.cgiの処理として
'<>'で標準入力からtest.txtの内容を読み込んで、
'|'を区切り文字としてテーブルタグに変換させる
正規表現を書ける人いませんか?
<table>
<tr><td>aaaaaaaaaa<td></td>ddddddddddddd<td></td>ggggggggggggg</td></tr>
<tr><td>ffffffffff<td></td>hhhhhhhhhhhhh<td></td>jjjjjjjjjjjjj<td></td>
<tr><td>mmmmmmmmmm<td></td>uuuuuuuuuuuuu<td></td>lllllllllllll<td></td>
</table>
というふうに変換したいのですが、うまく正規表現が書けません
0063nobodyさん
05/01/30 19:10:42ID:60wlVefX<table>
<tr><td>aaaaaaaaaa<td></td>ddddddddddddd<td></td>ggggggggggggg</td></tr>
<tr><td>ffffffffff<td></td>hhhhhhhhhhhhh<td></td>jjjjjjjjjjjjj</td></tr>
<tr><td>mmmmmmmmmm<td></td>uuuuuuuuuuuuu<td></td>lllllllllllll</td></tr>
</table>
↑のように変換したいのですが
0064nobodyさん
05/01/30 19:14:46ID:???ま、いくらでもいます。
0065nobodyさん
05/01/30 19:17:56ID:60wlVefXどのような正規表現で処理したら良いのか教えてください。
0066nobodyさん
05/01/30 20:23:18ID:???行頭の|を<tr><td>に置き換え。s/^\|/<tr><td>/;
行末の|を</td></tr>に置き換え。s/\|$/<\/td><\/tr>/;
その他の|を</td><td>に置き換え。s/\|/<\/td><td>/g;
<table></table>は適当に付ける。
0067nobodyさん
05/01/30 21:16:39ID:???\Q〜〜\E
はどういう意味ですか?
0069nobodyさん
05/01/30 21:44:03ID:???0071nobodyさん
05/01/31 01:31:35ID:???0072nobodyさん
05/01/31 07:14:59ID:???0074nobodyさん
05/01/31 13:13:56ID:???0075nobodyさん
05/02/02 10:56:57ID:hb9v8KSn若気の至りで、アクセス解析を読み込むためのJSファイルをHTML文書の頭に付けてたのですが、
思い直して</body>直前に入れなおしたいと思ったのですが、
speeeeed!(k,m,iオプション有)で、置換する際に、
<body><script type="text/javascript" src="foo.js"></script>
本文
</body>
・bodyとscriptの間に改行はない
・bodyにidが振られている場合もある
で、
<body(.*?)>(<script.*?script>)(.*?)</body>
↓
<body$1>$3$2</body>
とやってみたのですが、うまくいきませんでした。
ためしに、
<script.*?script>だけでマッチングを試してみたのですが、
<script type="text/javascript" src="foo.js"></script>にマッチしませんでした。
どう書き直したらよいのでしょうか?
全く根本的に間違ってるような予感がしますが、お教え下さいますよう宜しくお願いいたします。
0076nobodyさん
05/02/02 12:18:04ID:???<body(.*)>(<script.*script>\r\n)((.*\r\n)*)</body>
<body$1>\r\n$3$2</body>
0077nobodyさん
05/02/02 15:04:00ID:???でも"¥"などの実体参照化されてる部分の"&"は変換しません。
で自分なりに考えたのですが↓
$text="<p>キュウリ&ナス=¥200</p>";
$text=~s/&[^(yen;|euro;|amp;|copy)]/&/g;
print "$text¥n";
を実行すると、結果が
<p>キュウリ&ス=¥200</p>
となり、うまくいきません。
2行目の正規表現がおかしいと思うのですが、どう変えたらいいのでしょうか?
よろしくお願いします。
0078nobodyさん
05/02/02 15:10:51ID:???007977
05/02/02 15:12:58ID:???perlで文中の"&"を"&amp;"に変換したいと思ってます。
でも"&yen;"などの実体参照化されてる部分の"&"は変換しません。
で自分なりに考えたのですが↓
$text="<p>キュウリ&ナス=&yen;200</p>";
$text=~s/&[^(yen;|euro;|amp;|copy)]/&amp;/g;
print "$text¥n";
を実行すると、結果が
<p>キュウリ&amp;ス=&yen;200</p>
となり、うまくいきません。
2行目の正規表現がおかしいと思うのですが、どう変えたらいいのでしょうか?
よろしくお願いします。
0080nobodyさん
05/02/02 15:33:41ID:???これでどう?
$text =~ s/(?:(&(?:yen|euro|amp|copy);)|&)/$1?$1:"&"/ge;
0081nobodyさん
05/02/02 15:37:52ID:???0083nobodyさん
05/02/02 15:41:22ID:???0085nobodyさん
05/02/02 15:50:43ID:???0086nobodyさん
05/02/02 19:20:05ID:???ダメだとか言う前に自分のコード見せてみなm9(^Д^)プギャー
0087nobodyさん
05/02/02 19:25:17ID:???0089nobodyさん
05/02/02 23:52:44ID:???HTML4 で使える文字実体参照
http://www.ne.jp/asahi/minazuki/bakera/html/reference/charref
0090nobodyさん
05/02/02 23:56:25ID:???0091nobodyさん
05/02/03 04:21:06ID:???0094nobodyさん
05/02/03 06:43:00ID:???0096nobodyさん
05/02/03 09:12:37ID:???0097nobodyさん
05/02/03 13:43:04ID:???yen => 1,
euro => 1,
amp => 1,
copy => 1,
# 気が済むまで並べる
);
$text =~ s/(?:(&(\w+);)|&)/$1&&$entref{$2}?$1:"&"/ge;
0098nobodyさん
05/02/03 20:21:27ID:???0099nobodyさん
05/02/03 20:27:30ID:???0101nobodyさん
05/02/03 22:25:28ID:???0102nobodyさん
05/02/03 22:50:41ID:???古い車輪だと機械的に最小の性器表現を生成したりするんだが、まず読めないし遅い。
0103nobodyさん
05/02/03 23:37:30ID:???010497
05/02/04 00:47:42ID:???0106nobodyさん
05/02/05 10:31:05ID:???0109nobodyさん
05/02/05 14:18:00ID:???三項演算子使いまくりなのはuse warnings対策。
中身はほぼ>>97さんと同じ。
my %sp = map{$_ => 1} qw(
quot amp lt gt
nbsp iexcl cent pound
curren yen brvbar sect uml copy ordf laquo
...
lceil rceil lfloor rfloor lang rang loz
spades clubs hearts diams
);
$text =~ s/&(?:(\w{2,8});)?/$1 ? ($sp{$1} ? "&$1;" : "&$1;") : "&"/ge;
0110nobodyさん
05/02/05 14:28:42ID:???Wikiでプラグインをコールするような用途に向いていている。
&置換だけなら、よくある(?![\w\d]+;|#x?[A-Fa-f0-9]{1,6};)みたいので十分では。適当だけど。
全部羅列するならDTD依存で生成するから、コンパイラが吐いた長い正規表現でも、スクリプト生成の
でかいハッシュでも、保守性は変わらないかな。【代】
0111nobodyさん
05/02/05 16:39:25ID:???完全にstrictなHTMLが必要なのかも知れ無いし。
ハッシュ作るのマンドクセなら、他のモジュールから借用する手もある。
内部の変数に依存しているから、使い捨てのスクリプト程度にしか使えないけどね。
use HTML::Entities;
...
$text =~ s/&(?:(\w{2,8});)?/$1 ? ($HTML::Entities::entity2char{$1} ? "&$1;" : "&$1;") : "&"/ge;
0113109=111
05/02/05 17:00:43ID:???たまたま忘れただけさ orz
$text =~ s/&(?:(\w{2,8});)?/$1 ? ($HTML::Entities::entity2char{$1} ? "&$1;" : "&$1;") : "&"/ge;
0114nobodyさん
05/02/07 17:45:23ID:???0115名無しさん@Vim%Chalice
05/02/07 18:32:59ID:cdJVzA6kとにかく変数を検索するための正規表現を作りましたが
全然だメッス。↓が限界
\b[A-z_][A-z0-9_]*[\s]*?[^\(]
0116名無しさん@Vim%Chalice
05/02/07 19:01:26ID:cdJVzA6k変数はつらいが、関数もしくはメソッドならこれだぜ!!
(?=.)(?!(if|while|for|switch))\<[A-z_][A-z0-9_]*?[\s]*?(?=\()
0117nobodyさん
05/02/08 00:19:26ID:aXE3qbDZ"【PHP】くだらねぇ質問はここに書き込みやがれpart3" から誘導されてきました。
HTMLソース内に記述されている画像ファイル名を抽出しようと四苦八苦しています。
画像ファイル名は相対パスで指定されており、「../../」の部分も一緒に抽出させたいのです。
検索条件をお教えいただけないでしょうか。
$html = HTMLソース;
eregi("xxxxxxxx", $html, $var);
-- このような結果が返ってくる --
$var[0] == "../../aaa.jpg";
$var[1] == "image/bbb.gif";
・
・
・
お力添えをお願い致します。
0118nobodyさん
05/02/08 00:43:32ID:???preg_match_all('!<img .*src.*"(.+?)"!', $html, $var)
こういうやつとか?
0120117
05/02/08 09:49:40ID:9oMQzPoDありがとうございます!
マニュアルを見てみると、preg_match_all関数のほうが良さそうですね。
さりげなく教えていただき、大変感謝です。
あとは119で指摘されているクォーテーションマークの問題を
色々試して解決してみます。
あ〜正規表現を勉強しないと…(汗)
0121nobodyさん
05/02/08 10:09:22ID:???>>119の問題を回避するとしたらこんな感じでよろしいのでしょうか?
preg_match_all('!<img .*src=('|\")(.+?)('|\") .*>!', $html, $var)
0122121
05/02/08 10:10:46ID:???preg_match_all("!<img .*src=('|\")(.+?)('|\") .*>!", $html, $var)
です…
0123nobodyさん
05/02/08 12:43:15ID:???0124nobodyさん
05/02/09 10:01:21ID:???< >の中ににある ” ”または ’ ’の中にある > は無視したいんですが、
どうしたらよいでしょうか・・・。
0125124
05/02/09 10:03:20ID:clTgmqY1抽出しております。。
宜しくお願いします。
0126nobodyさん
05/02/09 13:09:04ID:???こんなのとか。
'/<\w+(?:\s+(?:"[^\"]+"|\'[^\']+\'|[^"\'\>]+)+)?>/'
0127nobodyさん
05/02/09 15:19:31ID:???ありがとうございます。
貼り付けてみたんですが、Parse errorになっちゃいました
何がまずいんでしょうか・・・
0130nobodyさん
05/02/09 19:56:51ID:???'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*\1)|noshade|selected|checked|multiple|noresize))*>/'
こんなとこで。
見落としありそうだけど。
0132130
05/02/09 20:47:31ID:???なるほど
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*?\1)|noshade|selected|checked|multiple|noresize))*>/'
とりあえず対応してみる。
■ このスレッドは過去ログ倉庫に格納されています