正規表現道場@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/
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))*>/'
とりあえず対応してみる。
0133nobodyさん
05/02/10 16:49:24ID:???0134nobodyさん
05/02/10 16:51:05ID:???0135nobodyさん
05/02/10 17:02:07ID:???ttp://jp.php.net/manual/ja/function.strip-tags.php
0136nobodyさん
05/02/10 17:38:07ID:???0137136
05/02/10 17:43:29ID:???'/<(?:[^"\'>]*?|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")*>/'
>>132
<a href=">" />も
0138nobodyさん
05/02/10 17:56:42ID:???0139130
05/02/10 21:00:18ID:???ども、対応してみる。
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*\1)|noshade|selected|checked|multiple|noresize))*\s*\/?>/'
これはいかがですか。
<![INCLUDE CDATA [ >>> ]]>
<script><!-- if (a>c) --></script>
0140nobodyさん
05/02/10 21:44:38ID:???これでダメみたい。
<a href=hoge>hoge</a>
hoge が消えちゃう。
'#</?\w+(?:\s+(?:\w+\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^"\'>\s]*)|\w+))*\s*/?'.'>#i';
0141nobodyさん
05/02/10 22:10:06ID:???正規表現で調べたいんだけど、うまく動作してくれない。
メールアドレスの正規表現って、
^[a-z0-9][\\w\\.]*@[^\\.][\\w\\.]+[^\\.]$
でいいよね?
0142nobodyさん
05/02/10 22:20:47ID:???とりあえずパッと見て気がついた点は、
[...] の中の '.' はエスケープしなくて良いのと、
ドメインにはハイフンもありうるけど \w にはハイフンは含まれない。
0143130
05/02/10 23:09:13ID:???エンバグしてました orz
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*?\1)|noshade|selected|checked|multiple|noresize))*\s*\/?>/'
# ああ、もういいや。
0144nobodyさん
05/02/10 23:13:25ID:???クォートなしの属性値はHTML4.01までならOKだから考慮する必要があるけど
実体参照になってない&<>"なんかは論外。
0145nobodyさん
05/02/11 00:21:17ID:???<!CDATA[ <tag attr=""> ]]>
0146nobodyさん
05/02/12 00:04:09ID:???0147130
05/02/12 08:02:28ID:???$sgml = '<!(?:\[\s*(?:[\w\.]+|\%[^;]+;)\s*\[.*?\]\]|[\w\.]+(?:\s+(?:\'[^\']*\'|"[^"]*"|\[[^\]]\]*|[^"\'>\s]*))*)>';
$remark = '<!(?:\s*--(?:\'[^\']*\'|"[^"]*"|[^"\']*?)*--\s*)?>';
"/$remark|$sgml|$html/is"
グダグダついでに。
SGMLをマッチする方向に変更。
ショートタグの大部分、エンプティタグ、NET、一つのタグ内の複数の注釈は非対応。
0148130
05/02/12 08:10:57ID:???$html = '<\/?[\w\.]+(?:\s+(?:\w+\s*=\s*(?:\'[^\']*\'|"[^"]*"|[^>"\'\s]*)|\w*))*\/?>';
でおながいします。
0149nobodyさん
05/02/12 23:55:30ID:???数字が10個以上連続していない行をマッチさせたいんですが、
どのような正規表現を書けばいいでしょうか?
0150nobodyさん
05/02/12 23:57:49ID:???0152nobodyさん
05/02/13 00:45:32ID:???直前に数字十個以上がない全ての文字の連続という正規表現を書けばいい
PCRE系ならMオプションをつけて行マッチさせろ
0153149
05/02/13 00:51:12ID:???数字10個のものを除外するのでは、
意図していることと違っちゃうのでちょっとだめです。
0154nobodyさん
05/02/13 01:05:37ID:???のほうが書きやすいか。
0155nobodyさん
05/02/13 02:09:24ID:???pcreなのかposixなのかも知らんし、どのくらい噛み砕けば理解できるのかも分からんし、
よく分からない、の「よく」がどの程度かも知らんし、データが複数行なのか単一行なのかも知らんし、
Gマッチなのか一個でいいのかも知らんし、正規表現書けるかどうかさえ知らんのだYO。
>>154
言葉からだといくつかパターンが考えられるけど、数字が続かない文字だと、
数字のみからなるデータで常に文末にマッチすることないか?
>>152のように否定言明を使って (?!\d{10,}). みたいにするしかないと思う。
後方言明だと可変長の正規表現を扱えないし、、、。
0156155
05/02/13 02:19:44ID:???ともかく普通に否定言明にドットつなげばいけるよ。
0157nobodyさん
05/02/13 17:13:27ID:iVFDDmsLある文字列が、全角カタカナで50字以内かいなかは
どうやっってかけばいいのでしょうか?
0158154
05/02/13 18:52:34ID:???あーそうかも。とりあえずパフォーマンスの悪い別解。激しくナンセンスだがw
/^(?(?!\d{10,}).*)$/
>>157
全角カナ換算で50文字以下なら、エンコード指定してmb_strcountか、strlenの結果を一文字の
バイト数で割って算出。
振り仮名などで対象がすべてカナであることも保障したい場合は、使用している文字コードの
全角カナのブロックをすべて文字クラス[]に放り込んで{,50}$を指定すれば、正規表現的にはOK。
0159nobodyさん
05/02/13 18:57:00ID:???○mb_strlen
ね
0160nobodyさん
05/02/13 19:14:12ID:???0161nobodyさん
05/02/13 20:11:56ID:???やりたいことはUTF8で書かれた日本語の文章から、
> −-―・「」!'(),….『』´’~☆‐/?“”、!+。
> []:→〈〉&()←×‥♂〜#`℃@"‘*¨「」φ|【】; %
> =〔〕《》◇∞〓♯●\^◎°○★�U♭?〃?�\▲≪≫
などの記号類を全て取り除きたいのです。
EmEditorの正規表現では\Wでこれが実現できるのですが、
perlで\Wとすると・・・。
宜しくお願いします。
0162nobodyさん
05/02/14 17:22:57ID:SqkH/Xuzタグはとりあえず見ずに、srcとhrefの後ろの=から"か'をキャッチして対応する
"or'までを取得したいのですが。。。
言語はPHPです。
0163nobodyさん
05/02/14 21:10:11ID:???perl5.8.1以降ならtr///が使える。
スクリプトもUTF-8で書かれていると仮定。
(\r\nは、マッチ文字列に改行が含まれていて、
改行コードが削除されてしまうための対策。不要なら削る。)
use encoding qw(utf8);
tr{\r\n
−-―・「」!'(),….『』´’~☆‐/?“”、!+。
[]:→〈〉&()←×‥♂〜#`℃@"‘*¨「」φ|【】; %
=〔〕《》◇∞〓♯●\^◎°○★�U♭?〃?�\▲≪≫
}{\r\n}d;
0164nobodyさん
05/02/14 21:38:42ID:KmG+pbP2シンプルにあらわす方法はないですか?
0168nobodyさん
05/02/16 16:27:58ID:SLDSz7ZK1と3の2つだけをマッチさせたいのですが、
/^[1|3]/
とすると、1、3はもちろんマッチするのですが、
11も12も13も・・・マッチしてしまいます。
この場合、どう書いたらいいのですか?
0169nobodyさん
05/02/16 16:29:48ID:???0170nobodyさん
05/02/16 18:09:46ID:???すみません、ソース晒します。phpです。
for($i = 1; $i <= 100; $i++) {
if(preg_match("/^[1|10|25|45|60]$/", $i)) {
echo $i."<br>";
}
}
この場合1、10、25、45、60がマッチして出力されるように
したいのですが、実際出力されるのは1、2、3、4、5、6と
なってしまいます。これを思い通りにマッチさせるのは
どうしたらいいのでしょうか?
0171nobodyさん
05/02/16 18:43:47ID:???0172nobodyさん
05/02/16 22:23:02ID:???<dt><a name=9>9</a> :<font color=green><b>名称未設定</b></font> :04/11/16 21:50:08 ID:VtVZWEIG<dd> てすと<br><br>
<dt><a name=8>8</a> :<a href=mailto:sage><b>名称未設定</b></a> :04/11/16 17:48:11 ID:nBSRrYU6<dd> てすと<br><br>
↓
dat
名称未設定<><>4/11/16 21:50:08 ID:VtVZWEIG<>てすと<>
名称未設定<>sage<>1/16 17:48:11 ID:nBSRrYU6<>てすと<>
のようにしたいのですが、
m#<DT><A.*?>([0-9]+).+?<B>(?:<A HREF="mailto:(.+?)">)?(.*?)(?:</A>)?</B>.{11}(.*?)<DD>(.*)<BR><BR>#mi
この正規表現だと、どうしてもsage等のメール欄もマッチしてしまい、
名称未設定<>sage<>のようにdatに残りません。
(?:<A HREF="mailto:(.+?)">)?の部分は、A HREFが出現した時にだけマッチする
のだと思うのですが、その後の(.*?)が<font color=green>にマッチしている
部分なのでしょうか。
0173nobodyさん
05/02/16 22:43:33ID:???m#<DT><A.*?>([0-9]+).+?(?:<A HREF=mailto:(.+?)>)?<B>(.*?)</B>(?:</A>|</FONT>) :(.*?)<DD>(.*)<BR><BR>#mi
0174nobodyさん
05/02/17 02:06:18ID:???HTMLのコメントタグを引っ掛けるにはどうしたらよいでしょうか?
単に引っ掛けるだけならできたのですが、例えば
<html><body>
<div id=" test<!--test ">a</div>-->
</body>
<html>
こんなのを引っ掛けないようにしたいんです。
■ このスレッドは過去ログ倉庫に格納されています