正規表現道場at PHP
正規表現道場 - 暇つぶし2ch650:nobodyさん
10/09/26 06:42:01 JLVe9rj0
Firebugで"aaaaaaaaaaaaaaaaaaaa".match(/(a)/)とすると2つしかヒットしないんですが、
全部のaをヒットさせるにはどうしたらいいんでしょうか?

651:nobodyさん
10/09/26 22:12:08
>>650
コールバック使うときは1つめの引数は全体だよ
"aaaaaaaaaaaaaa".match(/(a)/g);
これでいいと思う

652:nobodyさん
10/10/03 17:27:45
『a*a/a/*/a*a/a/*/a*a/a*a/a/*/a*a/a/*/a*a/a*a/a/*/a*a/a/*/a*a/a*a/a/*/a*a/a/*/a*a/a』

この文字列の
/* ~~~ */ で囲まれた部分それぞれを全て正規表現で抜き出せるのですか?

653:652
10/10/03 17:28:53
すいません。使用言語はPHP5.1.6です。

654:652
10/10/03 17:53:37
事故解決しました。

655:nobodyさん
10/10/20 18:27:58
「/index.php/blog/new/id/17」
から、phpファイル名(/index.php)のみ削除するにはどうすればいいでしょうか?
ファイル名は変わることがあります。

656:nobodyさん
10/10/20 22:18:19
s{/[^/]+?\.php}{}

657:655
10/10/21 01:50:09
PHPのpreg_replace()に渡してみたのですが、

>Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in
と言われてしまいます。。。

658:656
10/10/21 02:29:25
どういう引数を渡したのかちょっと知りたい。

<?php
$str = '/index.php/blog/new/id/17';

// $pattern = '/\/[^\/]+?\.php/'; // デリミタが / のときはエスケープ
$pattern = '{/[^/]+?\.php}'; // デリミタは { と }
$replace = '';

echo preg_replace($pattern, $replace, $str);
?>

659:nobodyさん
10/11/13 19:09:08 peMm7xtt
PHPで、例えば

こう言った文章を考えるのは、たのしい。
わたしは、「こんにちは」と言いました。
「この文章は、なかなか面白いですね。とても正確な正規表現を考える必要があるんです。」
「では、そんな正規表現をどうやって見つけるのでしょうか?そうだ、質問してみましょうよ!。」
「なるほど?。それは面白いアイディアだ。」と、もう一人は言った。

という文章があったときに、

"こう言った文章を考えるのは、たのしい。",
"わたしは、","「こんにちは」","と言いました。",
"「この文章は、なかなか面白いですね。","とても正確な正規表現を考える必要があるんです。」",
"「では、そんな正規表現をどうやって見つけるのでしょうか?","そうだ、質問してみましょうよ!。」",
"「なるほど?。","それは面白いアイディアだ。」","と、もう一人は言った。"

という感じに分割して配列にしたいと思っています。
現在使っている正規表現は
$contents = array();
preg_match_all('/.*?。|.*?「/m',$content,$contents);
という感じで書いてみました。
$contentがもとの文章で、$contentsが新しく得る配列です。
どうも複雑でどうしたら良いのかわからないので質問させていただきます。よろしくお願いします。

660:nobodyさん
10/11/14 09:26:59
一度にやろうとしないで分けてやればいいと思うよ

661:nobodyさん
10/11/14 22:54:16 xJLLsuw0
正規表現での重複行の削除について
質問させてください

みかん   みかん
みかん   (空白行)
りんご → りんご
なし    なし
なし    (空白行)
なし    (空白行)
かき    かき

というかんじで
重複行は空白のままで残したいのですが
どうすべきでしょうか?

662:nobodyさん
10/11/14 22:55:28
スクリプト言語でやったほうが楽じゃね?

663:nobodyさん
10/11/14 23:35:35 xJLLsuw0
できればこんなかんじで
エディタの検索置換でやりたいです


URLリンク(d.hatena.ne.jp)

664:nobodyさん
10/11/15 00:12:15
でこぽん
みかん
りんご
りんご
みかん
みかん
りんご
でこぽん

こんな風に離れた行に重複がある場合はどうすんだろ?ソート済みなのかな。

665:nobodyさん
10/11/15 00:48:49 AfSBC14n
エクセルでソートしてあるます


666:nobodyさん
10/12/06 23:51:24 k5Tua1Td
メールアドレスが正しいかマッチング。
ただし、@gmail.com、@googlemail.com、@livedoor.comの場合は
@の前に「+」「.」が含まれている場合は除外する。
これって正規表現1発でできたりしますか?

667:nobodyさん
10/12/06 23:53:00
yes

668:nobodyさん
10/12/08 14:11:59
メールアドレスの妥当性の判定はどのぐらい厳密にやるのだろう

669:nobodyさん
10/12/20 16:51:11 Qb400/Ia
php5で、tableタグ内の改行(<br />)を全て削除したいのです。
どうしたら良いんでしょう。

●置換前
<table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"><br />
<tbody><br />
<tr><br />
<td><br />
</td><br />
</tr><br />
</tbody><br />
</table>

●置換後
<table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx">
<tbody>
<tr>
<td>
</td>
</tr>
</tbody>
</table>

670:nobodyさん
10/12/20 20:03:43
>>669
str_replaceでおk

671:nobodyさん
10/12/20 20:48:53
普通はstrip_tagsじゃね?

672:nobodyさん
10/12/21 08:13:01
テーブル外のbrは削除したくないんだろ

673:nobodyさん
10/12/24 08:47:52
この手のことをやりたい人は沢山いると思うので
散々既出の可能性がありますが、
参考ページでも構いませんので教えてください

UWSCのコードを書くのにK2Editorを使っています
仕上げたコードの可読性をあげるために
演算子の前後にスペースを入れたいです
例 x+y=z
  x + y = z

K2Editorの正規表現はBREGEXP.DLLを使っています
以下の置換をマクロで行います

"([^ ])([\+\-\*<])","$1 $2"
"([^ <])>","$1 >"
"([\+\-\*=])([^ ])","$1 $2"
"([^ <>])=","$1 ="
"<([^ =>])","< $1"
">([^ =])","> $1"
"([^ \/])\/([^\/])","$1 /$3"
"([^\/])\/([^ \/])","$1/ $3"
" "," "
" +"," "
"([,=\+\-\*\/\(<>]|mod|and|or|xor) - ","$1 -"

正規表現はド素人でネットで検索しながら書いたので
まずい部分も多いと思いますがそれは置いといて、
本題はダブルコーテーションで括られた文字列内は
置換したくないのですが、何か方法はありますか?

674:nobodyさん
10/12/29 07:28:15
性器表現難しいよね

675:nobodyさん
11/01/06 22:08:59 y0rS3N6j
質問です。PHP5.3でpreg_matchを使っているのですが、例えば
「次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては・・・」
という文章より法律名称や条などをwhileループで拾い上げたいのですが、

/([第]*)([1-9]+[0-9]*)([条項号]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/

で拾い上げると、法律名称(上の文章だと「建築基準法」)が抜けてしまうので

/([建築基準法|建築基準法施行令]*)([第]*)([1-9]+[0-9]*)([条項号]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/

と言う形で拾うと、なぜかpreg_match($match, $text, $arr)の$arrの中に、なぜか「第」という文字が拾われてきません。
これは何故なんでしょうか??
もし理由が分かる方がいらっしゃったら、お教え願います。

676:nobodyさん
11/01/07 03:55:37
性器表現で痴漢する

677:nobodyさん
11/01/07 03:58:44
$text = '次章(第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては';
$pat1 = '/([第]*)([1-9]+[0-9]*)([条項号]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/';
$pat2 = '/([建築基準法|建築基準法施行令]*)([第]*)([1-9]+[0-9]*)([条項号]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/';
preg_match($pat1, $text, $arr);
var_dump($arr);
preg_match($pat2, $text, $arr);
var_dump($arr);

array(7) {
[0]=> string(62) "第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては"
[1]=> string(2) "第"
[2]=> string(2) "20"
[3]=> string(2) "条"
[4]=> string(1) "3"
[5]=> string(0) ""
[6]=> string(53) "、第1節の3、・・・除き、建築基準法第80条の2にあっては"
}
array(8) {
[0]=> string(62) "第20条の3、第1節の3、・・・除き、建築基準法第80条の2にあっては"
[1]=> string(0) ""
[2]=> string(2) "第"
[3]=> string(2) "20"
[4]=> string(2) "条"
[5]=> string(1) "3"
[6]=> string(0) ""
[7]=> string(53) "、第1節の3、・・・除き、建築基準法第80条の2にあっては"
}

第が拾われないってどこの話?
あと関係ないけど複数拾いたいならpreg_match_all

678:nobodyさん
11/01/07 08:16:20
[マルチバイト] この時点でおかしいやろ

679:nobodyさん
11/01/07 08:35:43
u 修飾子つきじゃないのかな?
[第]* は量指定子も含めてどうかと思うけどね。

680:nobodyさん
11/01/07 11:13:33
PHPのPerl互換正規表現で、連続した文字を判定したい(3文字以上)
下のではだめ?
preg_match("/(.)\1{3,}/", $hoge)
例→AAA、bbb、111、あああ他なら引っかかるようにしたい、ということ

681:nobodyさん
11/01/07 11:42:34
>>680
考え方はいいけど、最初の(.)で1文字食われるから繰り返し回数が
1回多い。それじゃ4文字以上になっちゃうぞ。

682:nobodyさん
11/01/07 12:06:39
>>681
4文字以上連続した文字だとしても、想定したように動かない・・・
↓OK(Perl)
my $hoge = 'aaaa'; if ($hoge =~ /(.)\1{3,}/) { print 'OK'; } else { print 'NG'; }
↓NG(PHP)
$hoge = 'aaaa'; if (preg_match("/(.)\1{3,}/", $hoge)) { echo 'OK'; } else { echo 'NG'; }
PHPは\1って表現できない?

683:nobodyさん
11/01/07 12:28:18
"..."の中だから¥¥1と書かないと駄目だろ。


684:nobodyさん
11/01/07 13:39:43
$hoge = 'aaaa';
echo preg_match('/(.)\1{3,}/', $hoge) ? 'OK' : 'NG'; // OK

"\\1" か '\1' だよね。

685:680
11/01/07 14:21:39
あたしばかよね・・・
ありがとうございました
uも付けて完動です

686:675
11/01/08 22:00:49 GTa36OYO
返事遅くなりまして申し訳ありません。
/uを追加したら見事に機能しました。
というか、今までさんざん正規表現を日本語に適用していたのですが、/uのことを全く知りませんでした。
お恥ずかしい限りです。

お教えいただき、ありがとうございました。

687:675
11/01/17 22:15:13 Br3WLX+O
更に質問です。
「...にあっては国土交通大臣が定めた安全上必要な技術的のうちその指定するに係る部分に限る。)、第119条、第5章の4(第129条の2の5第1項の2第6号...」
という文章から、第○○条の○○の○○などを抜き取り、かつその前後の文章も取得したいと考えています。
そこで
「/^(.+)*([第])([1-9]+[0-9]*)*([条]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/u」
というパターンでpreg_matchで拾いだそうと思うのですが、全く思うように拾いだせません。
何が問題なのでしょうか??
プログラムとしては、
<?php
$text = 'にあっては国土交通大臣が定めた安全上必要な技術的のうちその指定するに係る部分に限る。)、第119条、第5章の4(第129条の2の5第1項の2第6号の文章';
print 'text : ' . $text . '<br>';
$match = '/^(.+)*([第])([1-9]+[0-9]*)*([条]+)[の]*([1-9]+[0-9]*)*[の]*([1-9]+[0-9]*)*(.*)/u';
print 'match : ' . $match . '<br>';
preg_match($match,$text,$arr);
print 'arr : ';
print_r($arr);
print '<br>';
?>
こんな感じです。
もし分かる方がいらっしゃったら、お教え願います。

688:nobodyさん
11/01/17 22:47:22
問題を切り分けてから質問してくれ

689:マッチした文字列を小文字にしたい
11/01/17 22:59:46 e71m2/yA
PHPにおける正規表現に関する質問です。
下のサンプルプログラムでは$3が両方とも大文字の「US」になりますが、
最初の$3だけを小文字の「us」にする方法があれば教えてください。
OSはWindows、PHPは5.3です。

元の文字列の例
Country: US

変換後に得たい文字列の例
Country: <a href="URLリンク(ja.wikipedia.org)">US</a>

サンプルプログラム
<?php
$result = '';
$text = 'Country: US';
$pattern = '/(Country):(\s+)([A-Z]{2})/i';
$replace = "$1:$2<a href=\"URLリンク(ja.wikipedia.org)">$3</a>";

$result = preg_replace($pattern, $replace, $text);

echo $result;
?>

690:nobodyさん
11/01/17 23:51:56
手元のエディタでは\Lでできるんだけどな
PHPで使える置換パターンが良く分からない
e修飾子つけちゃうとか

691:689
11/01/18 01:02:24
そうですね。Perlだと\lで次の文字が小文字になるとかあるみたいですが、
PHPにはないんですかね?

ほかの方法でもかまいませんので、
引き続き、回答をお待ちしております。

692:nobodyさん
11/01/18 01:17:36
>>689
$pattern = '/(Country):(\s+)([A-Z]{2})/ie';
$replace = '"$1:$2<a href=\"URLリンク(ja.wikipedia.org)" .strtolower($3). "\">$3</a>"';

書いてみたら引用符がすっきりしない感じになってしまった。

693:nobodyさん
11/01/18 19:32:41 sm74ERjN
あの正規表現ですが、今までうまくつかえていないというか下手
です。で、勉強しようと思うのですが、
反復学習ソフト付き 正規表現書き方ドリル
これいいですかね?
オライリーとどっちがいいかなって思うんですけど。


694:nobodyさん
11/01/18 22:59:06
>>693
Webでおk

695:nobodyさん
11/01/19 10:36:15
>>693
良いと思うよ。
オライリーも良い本だけど、ひととおり基礎ができてからで良いと思う。

696:689
11/01/19 21:20:53
>>692
できました。
ただ、「DO」というドミニカの国別コードの時、予約語と重なってエラーになったので、
ダブルクォートにしました。

$pattern = '/(Country):(\s+)([A-Z]{2})/ie';
$replace = '"$1:$2<a href=\"URLリンク(ja.wikipedia.org)" .strtolower("$3"). "\">$3</a>"';

どうもありがとうございました。

697:nobodyさん
11/01/19 21:48:50
>>690でe修飾子と言っているのに


698:nobodyさん
11/01/19 23:40:21 zqG6AlFK
抽象的な質問で申し訳ないんですが、本の話が出たのでついでに伺いたいんですが。
今まで表計算ソフトやデータベースソフトなど普通に習得し、
更に興味が出てきたのでMySQLとPHPを使ってプログラミングしたり、
apacheやPostFixなども何とか使えるようになり、何となく分かってきた感じがしてるのですが、
正規表現に関しては、未だに「どうにか使っているけど、理解は出来ていない感じ」がします。
とりあえずやってみて、だめで違う手を試してみたりして....
まるで別種類な考え方が必要な気がします。

なので質問なのですが、正規表現を理解するのに一番良い本とか、
正規表現について「目から鱗が落ちた!!一皮むけた!!理解が深まった」
って思えるような本とかあったら、紹介いただけないでしょうか??

それとも忍耐強く、失敗しては考える繰り返しでなければ、習得できない物なのでしょうか??
当方今年で三十路なので、頭が固くなってきてるのかもしれませんが、いまいち頭にしみ込みにくくなってるような気がしてます。
もしよろしければお教え願います。

699:nobodyさん
11/01/20 00:05:42
>>698
何となく分かった気になっている時は何も分かってないからもっと簡単なのからやれ

700:693
11/01/20 01:01:52 973KUxXQ
>>695
ありがとうございます。
基礎から勉強したいので、買います。


701:nobodyさん
11/01/20 13:16:18
正規表現のスレ (プログラム板や UNIX 板にもある) のログを見て、
質問のお題を片っ端から解いていくと、結構良い練習になると思う。

702:nobodyさん
11/01/20 23:13:37 LxK6uyro
次の正規表現でhogeフォルダ以下の最後の「/」の後に「i/」が挟まるようにURLを変換しております。

RewriteRule ^/hoge(.*)/(.*).html$ URLリンク(example.com) [L]



下記のような場合は問題ないのですが

URLリンク(example.com) → URLリンク(example.com)
URLリンク(example.com) → URLリンク(example.com)



↓のようにhogeで始まるディレクトリまでも変換されてしまいます。
URLリンク(example.com)

hogeフォルダ配下のみ変換されるようにするには、どうしたらいいでしょうか?

環境は
CentOS5
Apache2


703:nobodyさん
11/01/21 00:15:43
/hoge/(.*)~にすればいいじゃん

704:nobodyさん
11/01/21 18:26:53
>>698
頭の良い人だとまた違うのかもしれないけど、
我々のような凡人は繰り返しやって経験値を積むしかないかなあ、って気がする。
で、何か読んで一つ山を越えたいなら、現状ではオライリー本の一択しか無いと思う。

705:nobodyさん
11/02/10 13:57:44
対象の文字列にハングル文字が含まれるかどうかを判断したいのですが
よい方法が思い浮かびません。
javascriptです。

706:nobodyさん
11/02/27 08:37:54.94 GexZY7hJ
1. preg_match('/[\(]{2}?(.*?)\:(.*?)[\)]{2}?/', $text, $match)
この変換を変数展開で実行したいのですが、
正規表現で使える記号の変数展開のやりかたを教えてください。

2.$exprString = '/[\(]{2}?(.*?)\:(.*?)[\)]{2}?/';
  preg_match("/$exprString/", $text, $match);
これだとうまく行きません。

707:nobodyさん
11/02/27 09:01:28.34
"/$exprString/"を展開したら"//[\(]{2}?(.*?)\:(.*?)[\)]{2}?//"になるぜ?

708:706
11/02/27 09:23:38.46
>>707
解決しました。全く気がつかずに悩んでました。ありがとうございます。

709:nobodyさん
11/02/27 16:36:06.93 KOnmSusx
反復学習ソフト付き 正規表現書き方ドリル
やりました。
非常に勉強になりました。楽しかったし、なんかパズルをといている
みたいで、ただ残念ながらソフトはうごきませんでした。


710:nobodyさん
11/03/03 19:14:51.88 v/2VFVai
以下はqdmail_receiver.phpというメール受信のプログラムの一部で、
添付ファイルのファイル名を取得している部分になります。

しかし、ファイル名に半角スペースがあると、半角スペースで文字列が切れてしまう
という現象があります。

半角スペースで途切れないようにするのはどのようにすればよいのでしょうか?


preg_match('/name\s*=\s*"?([^"\s\r\n]+)"?\r?\n?/is',$header['content-type'] , $matches )


よろしくお願いします。


711:nobodyさん
11/03/03 20:18:10.39
[^"\s\r\n]+
"でもスペースでも改行でもない文字が続く限り~
って自分で書いてるやん

712:nobodyさん
11/03/04 10:24:26.15
ここで聞いてるくらいだから [^"\r\n]+ こう書き換えれって教えないと

713:710
11/03/04 13:32:58.16 8WvXj1g+
>>712
ありがとうございます。

うまくいきました。

<(_ _)>

714:712
11/03/04 16:50:29.72
うまくいったならいいけど、ファイル名抜き出し部分の後続がすべて?だから
もし"で囲まれてないのが来たらアウトだけどな

/name=(?:"([^"\r\n]+)"|([^\s\r\n]+))/i でマッチさせて
if (empty($matches[1])) $matches[1] = $matches[2];
みたいにしたほうが手堅いかもな

715:nobodyさん
11/03/06 18:00:58.46
【言語】PHP5.3
【OS】XP

自前のBBSをもっていますが、最近、レス番号にリンクをつけたく思い、「>>1」のようなレスをpreg_matchでリンクタグ生成しようと試みました。
preg_match('/>>[0-9]+/',$text,$link);
preg_replace('/>>[0-9]+/','<a href="#">'.$link[$n].'</a>',$text);
この関数では最初にマッチするレスしか変換できませんでした。
何かよい案がありましたらお願いします。

716:nobodyさん
11/03/08 00:32:23.62
preg_match_all 使えば?

717:nobodyさん
11/06/04 18:19:07.23 GeFi3irL
<html>......<div class="list">画像リスト<br>1枚目<br><img src="URLリンク(example.com)"><br>
2枚目<br><img src="URLリンク(example.com)"><br>
3枚目<br><img src="URLリンク(example.com)"><br>もっと見る<br></div>........</html>

これで<div class="list">と</div>の間のアドレスだけ抜き出すのってどうやりますか?
........の中にも画像アドレスがあります。そっちはマッチさせないようにしたい。

preg_match_all("/list\".+?src=\"(.+)\".+</div>/", $html, $m);

718:nobodyさん
11/06/04 19:29:38.67
2段階に分けるべし

719:nobodyさん
11/06/04 19:32:39.30
>>717
なんでそれを正規表現でやろうとするのかがわからん。視野狭窄か。

720:nobodyさん
11/06/04 22:11:24.15
>>717
URLリンク(php.net)

721: 忍法帖【Lv=4,xxxP】
11/06/04 22:38:07.91
質問者が言語を指定していない時点でお察し下さいレベル。

722:nobodyさん
11/06/04 23:04:45.68
preg_match_all は PHP の関数

723:nobodyさん
11/06/05 14:02:49.98 uEzVCQDA
>>717
正規表現一発でできそうな気がするんですが、無理ですか?

固定単語--- この中を検索 ---固定単語

こんな場面てよくあるような

724:nobodyさん
11/06/06 08:01:30.97
>>709
win7HP?

725:nobodyさん
11/06/16 23:36:27.10 SYj2PUn3
phpでpreg使っています。
あるファイル内の
<td width="71%" valign="top" align="center"><div align = "center">

<td width="71%" valign="top" align="center">
だけに変換したいとおもい
$regTxt = "/<td ([a-z0-9\"=\s\%]+)><div ([a-z0-9\"=\s\%]+)>/is";
preg_match($regTxt,$x,$exchangeArr);
で$exchangeArr[1]を削除するため、preg_replaceを使おうと思っています。

ただ、最初のpreg_matchでマッチしません。
どうしたら出来るのでしょうか??

どなたかお教えください。お願いします。

726:nobodyさん
11/06/16 23:41:03.98
preg_matchで$exchangeArr[1]を削除するためpreg_replace?
日本語でおk

727:nobodyさん
11/06/16 23:44:03.44 SYj2PUn3
<div align = "center"> を削除するため
でお願いします。

728:nobodyさん
11/06/16 23:45:43.17
preg_matchとpreg_replaceを併用する必要があんの?

729:nobodyさん
11/06/16 23:52:34.42 SYj2PUn3
<td....>が様々な形をとっているため、まずはそれらを取り出す必要があるかと思い、そうしてます。

<td....><div...>という形で、<td...>も<div...>のそれぞれの...が、様々な形をとっているけど、<td...>だけをきれいに残したいのです。

ただ、<div...>だけのもの(前に<td...>がついていない)は変換したくないのです。
こんな説明でわかります?

730:nobodyさん
11/06/16 23:56:08.62
正規表現を細分化して問題の切り分けしてみるといいと思うよ

731:nobodyさん
11/06/18 14:34:02.52
>>725,729
その様々な形を正規表現で指定すればいいと思うけどね。

$string = '<td width="71%" valign="top" align="center"><div align = "center">';
$string = preg_replace('/(<td [^>]+><div) [^>]+/', '$1', $string);

732:nobodyさん
11/06/18 14:41:26.83
閉じタグのことは無視かい

733:731
11/06/18 17:07:20.38
>>732
それは俺も思った。
divがネストしていたら対応関係がおかしくなるはずなんで開始タグは残すべきだと思うな。

734:nobodyさん
11/06/30 00:52:32.34 hWRw8zI0
PHP5.3のpreg_replaceで
/<td[^>]+><div[^>]+/とかで正規表現をやっても、全く変更されません。
preg_matchでやってみると<td[^>]+>までならmatchするけど、「<」以降を入れると、全く引っかかってきません。

何か思い当たること、ないでしょうか?

735:nobodyさん
11/06/30 06:05:38.15
対象としている文字列にその正規表現にマッチする部分が存在しない

736:nobodyさん
11/06/30 07:23:46.62
何か勘違いしているとか見落としているとしか思えない

737:nobodyさん
11/06/30 21:31:52.67
量指定子を'+'から'*'にしてみたらマッチしました、みたいな話な気がしてならない。

738:734
11/07/03 22:32:36.09 8QAPbG3u
どうやら正規表現は問題なかったみたいです。
phpでファイルをfopenで読み込んで、
while ($x = fgets($fp,1092)) {...}で変換をさせているんだけど、
<td..>部分と<div..>部分の間に改行が入っているから、変換できないらしい。
どうしたらいいでしょう??

739:nobodyさん
11/07/03 22:39:11.31
工夫すれば?

740:nobodyさん
11/07/03 23:37:07.72 ypX399q3
$string = preg_replace('/<div align = \"center\"> /', '', $string);
$string = preg_replace('/<\/div>/', '', $string);
か、

$string = preg_replace('/<div(.*?)> /', '', $string);
$string = preg_replace('/<\/div>/', '', $string);
じゃねえの

741:734
11/07/03 23:45:10.46 8QAPbG3u
全てのdivを削除したい訳でなく、<td....></td>間にある<div></div>を削除したいのです。
<td....></td>間にあるものは削除して、それ以外は改行したいのです。

742:nobodyさん
11/07/05 00:46:35.42
preg_replaceを連打して取りたいのだけ取ればええやん

743:nobodyさん
11/07/16 18:02:18.22
http://から最初の空白までを抽出する正規表現はどうなりますか?

744:nobodyさん
11/07/16 22:16:17.55
/http:\/\/[^ ]* /

745:nobodyさん
11/07/23 20:12:09.44 lXdqpzgT
Aの繰り返しはA+とかA{m,n}でマッチできますが、
繰り返された個数を元にAAAAAをA*5などに置換する「うまい」方法はあるでしょうか。

言語はとりあえずJavaScriptで考えています。
replace(/A+/g, 'A*'); //←ここから進まない。

746:nobodyさん
11/07/23 20:22:41.87
>>745
正規表現にはないのでJavaScriptスレへ

747:nobodyさん
11/07/23 20:34:12.11 lXdqpzgT
>>746
ありがとうございます。以下で質問し直しました。
スレリンク(hp板:90番)n

748:nobodyさん
11/07/24 19:06:14.31 /DoWXp9n
「次の人」または「前の人」という文字列を文章内から拾う場合、どの様な書き方が良いのでしょうか??
[次の人 | 前の人] だと「の」一文字だけでも拾ってしまいます…

749:nobodyさん
11/07/24 21:04:07.81
"[abc]"は「『a』か『b』か『c』にマッチ」だぞ…。
君の書いた正規表現は「『次』か『前』か『の』か『人』か『|』か『 』にマッチ」だ。

多分"(次の人|前の人)"みたいなことがしたかったんだろうけど、
"[次前]の人"でいいと思う。

750:nobodyさん
11/07/24 21:07:51.65
あと、似たようなのでありがちなのが
"[^hogehoge]"で文字列の否定を指定したつもりになっちゃう人。

もちろん間違い。念の為。

751:nobodyさん
11/07/24 22:38:19.38 X7IDpmYo
>>750
では何が正しいのでしょうか?

752:nobodyさん
11/07/24 22:54:58.14
>>751
[次前]の人

753:nobodyさん
11/07/24 23:02:35.46
あ、とんちんかんだった。
文字列の否定は
(?!.*文字列.*).*
みたいのかなぁ

754:nobodyさん
11/07/25 21:55:36.12 RVWZInKC
formからの情報を編集しているんですがケータイ絵文字(5社の)が入ったら消すというのはできますか?

PHP5です。

755:nobodyさん
11/07/25 22:46:11.52
>>754
3社だけど、
Emo PHP携帯絵文字ライブラリ
URLリンク(gard.no-ip.info)

756:nobodyさん
11/07/25 23:06:55.26 RVWZInKC
>>754

ありがとうございました

757:nobodyさん
11/07/27 20:41:33.29 PkulA4Dr
40過ぎたオッサンが、訓練校出てWebで独立するとか寝言いってますwwwwww
サラリーマンに、無理だと指摘され発狂中wwww



Webデザインの基金訓練を受講してる人 Part2
スレリンク(dame板)

>>505

俺は40代で基金訓練受けて、これから独立しようと考えてるがな。
まぁ若干経験あるからその方面での話だけど。
基金訓練は単に「バナーくらい作れますよ」って言うだけのために受けた。

30代ならデジハリにもいっぱいいるぞ、余裕だろ。
ちゃんとした社会人経験があればだが。

758:nobodyさん
11/07/30 14:00:39.72
>>757
ID:1gQ87Cnm がきもかった

759:nobodyさん
11/08/01 07:47:20.91
^(\d{3},)*\d{3}$
上記正規表現で123がヒットする理由が分かりません
カンマがなくても何故ヒットするんですか?
*の前が()だからであってますか?

<対象文字列>
123
123,456
987,654,321
123,789,456,012
9876,543
123,456,

<HIT文字列>
123
123,456
987,654,321
123,789,456,012



760:nobodyさん
11/08/01 07:59:48.61
>>759
*の意味を調べよう

761:nobodyさん
11/08/01 07:59:51.56
* → + で解決しない?
*はゼロ個以上でマッチだから。


762:759
11/08/01 08:58:25.47
>>760
調べなくても分かってますが()*も同様なのかと思いまして

>>761
いえ、nnnの場合もヒットさせたかったので*でいいのです
仕様というか動きの確認だけが目的で書き込んだので

763:nobodyさん
11/08/01 09:39:13.59 3IgNAOvk
>>759の意図がいまいちよくわからんが、
「a*」の時と「(abc)*」の時とで*の機能が変わらないことを確認したかったの?

あと若干言葉遣いに波風が立つ雰囲気を感じてしまうのはオレだけ(笑)?

764:nobodyさん
11/08/01 09:43:31.28
ヒント:ID隠し

765:nobodyさん
11/08/01 09:48:49.11
俺もちょっとイラッときた

766:nobodyさん
11/08/01 09:52:47.51
(\d{3},)* 関係ないじゃんw

767:nobodyさん
11/08/01 10:28:45.34
>>762
どう見てもわかってないだろw

768:nobodyさん
11/08/01 17:56:48.08
>>763
> >>759の意図がいまいちよくわからんが、
> 「a*」の時と「(abc)*」の時とで*の機能が変わらないことを確認したかったの?
はい

> あと若干言葉遣いに波風が立つ雰囲気を感じてしまうのはオレだけ(笑)?
イラッ☆

769:nobodyさん
11/08/01 17:59:56.76
機能が変わらない事の確認なのに質問内容が
>ヒットする理由がわかりません
っておかしいだろw

770:nobodyさん
11/08/01 18:00:59.64
>>766
どう言う事でしょうか?
もっとスマートな方法があるのであれば是非ご教示願います

>>767
何がいけないのかさっぱりです
直近文字の0回以上のhitって事でないの?

771:nobodyさん
11/08/01 18:02:51.58
>>769
そんなおかしいですかね
でも、確かに表現が悪くて申し訳ないです


772:nobodyさん
11/08/01 18:11:52.38 3IgNAOvk
根はいいやつそうでよかった(´ω`)…。

773:nobodyさん
11/08/01 18:44:25.32
直近「文字」とは限らないだよ。
(お題のこんなのとか)*(?:ほかにもこんなのとか)*[いろ]*あるでしょう。

774:nobodyさん
11/08/01 19:21:33.25
>>770
123がヒットしたのは
\d{3}の部分だけといえば分かるだろうか
(\d{3},)*は0回ってことで

775:nobodyさん
11/08/01 22:22:11.88
>>774
超絶完全理解感謝激励歓迎降臨!
謝謝!!

伝わり難い文章で多レスしてしまってすいませんでした

776:nobodyさん
11/08/01 22:37:10.25 3IgNAOvk
>>774の指摘がそこまで的確なものだったってのもいまいちピンと来ない件(笑)
まあよかったな( ´∀`)

777:nobodyさん
11/08/01 22:54:31.04
わろた

778:nobodyさん
11/08/02 11:07:19.68
結局わかってなかったんじゃんw

779:nobodyさん
11/08/03 19:33:03.57
762 名前: 759 [sage] 投稿日: 2011/08/01(月) 08:58:25.47 ID:???
>>760
調べなくても分かってますが()*も同様なのかと思いまして

>>761
いえ、nnnの場合もヒットさせたかったので*でいいのです
仕様というか動きの確認だけが目的で書き込んだので


780:nobodyさん
11/08/04 09:41:51.16
動きの確認ならパターン出してテストすりゃいいだけじゃん

なんかイラッとするな

781:nobodyさん
11/08/04 12:34:18.67
>>780
イラッ☆

782:nobodyさん
11/08/26 08:02:24.21
test

783:nobodyさん
11/09/02 00:33:38.37
>>782
イラッ☆

784:nobodyさん
11/09/06 00:06:31.30
ttp//aaa.co.jp:8888
http//bbb.com:9999/
を除外しつつ
他の
h?ttp//○○○.△△△.□□□:☆☆☆/?
     ↑ここから      ここまで↑
をヒットさせたいのですが色々試したのですが出来ませんでした
何か方法がありますでしょうか?

785:nobodyさん
11/09/06 00:20:00.51
h?ttp:\/\/(?!aaa.co.jp:8888|bbb.com:9999)(\w+\.)+\w+(:\d+)?\/?

786:nobodyさん
11/09/06 00:28:37.10
>>785
レスありがとうございます
助かりました

787:nobodyさん
11/09/14 01:54:57.08
2chのdatの1(1行目)のレス内にトリップ(10桁以上でも10~12桁でもok)が
含まれてる場合にヒットさせたいのですが、一部除外したいトリップあります

◆(?!5s5hPZiJeU|ozOtJW9BFA).{10}
まではできたような気がするのですが1行目にマッチさせるにはどうしたら良いでしょうか
SJISです。


788:nobodyさん
11/09/14 08:26:15.86
>>787
^?dとか

789:nobodyさん
11/09/14 13:20:15.86
>>787
mフラグ

>>788


790:nobodyさん
11/09/15 22:42:04.53
>>789
ありがとうございます
よく分からなかったので調べてみると複数行の行頭、文末にマッチさせることができるのですね
残念ながら行頭、文末にトリップがあるわけでないのでうまくないようです。。


791:nobodyさん
11/09/16 01:40:23.90
>>790
789ではないが、mフラグをつけたら駄目だ
^ を利用すれば一行目のトリップにマッチできる
mフラグをつけたら破綻する

792:nobodyさん
11/09/16 01:49:30.98
処理系を書かないからでしょ。

>>789のいうmオプションは「改行文字を無視する単一行モード」の意味
(Ruby等の流儀)で書いていて、
>>790はそれを「複数行モード」の意味(Perl等の流儀)に取っている。

793:nobodyさん
11/09/22 02:27:55.73
>>790
先頭から、最初に改行コードが出てくるまでが1行目だよ

794:nobodyさん
11/10/02 19:26:42.05 Tnal10Vi
abcdefgfedcba という文字列から
defという文字列を消すこと出来るのですが、
def以外を消すにはどうすればいいのでしょうか?

795:nobodyさん
11/10/02 20:09:22.37 zbShr9jh
漠然としすぎ

796:nobodyさん
11/10/03 06:19:41.91
>>794
よくわからんが否定はめんどくさいぞ。

([^def]|d(?!ef)|(?<!d)e(?!f)|(?<!de)f)

でdefの一部であるd,e,f以外の任意の1文字にマッチするから
これでなんとかなるだろう。



797:nobodyさん
11/10/03 21:56:35.04
>>794
環境によるけど、(def)ですべてにマッチさせて、あとから取得した$1的なものに置換すればいいのでは

798:nobodyさん
11/10/07 11:38:20.62
>>794
/def|[\s\S]/ でcallbackして def 以外は全て削除


799:nobodyさん
11/10/10 10:36:17.70
PHPにてHTMLタグ以外の全ての文字について、全角・半角の統一などの処理を
したいと思うのですが、例えば英字を全角で統一したい場合、素人考えでは
最も単純に作業をするには「全ての英字を全角に」→「タグのみ半角に」という
2回に分けた処理がベストかと思うのですが、もっと効率の良い処理の方法は
ありますでしょうか?


800:nobodyさん
11/10/10 11:10:33.30
PHPなら効率にこだわるより、メンテナンス性を重視した方がいいと思う。

801:nobodyさん
11/10/10 16:07:33.02 gughiUX1
"<"に続く文字(">"が来たら終了)は全部半角化
それ以外はどしどし全角化

でおk
それはさておき、やんごとなき理由さえなければ統一するなら全角じゃなく半角にしとけ。

802:nobodyさん
11/10/11 00:33:04.23
>>799
DOMで処理するのがいいかと

803:nobodyさん
11/10/11 00:36:07.74
>>801
<input type="button" value="zenkaku">

804:nobodyさん
11/10/11 23:11:43.85
>>800
メンテナンス性にこだわるとどんな感じになるか……まるでイメージできません……orz

>>801
すいません、やんごとなき理由で全角化せねばならないのです…。
ところでその方法は正規表現は特に使わず、1文字ずつチェックしていく感じでしょうか?

>>802
DOMを使うというと……やはりこれも正規表現は使わない感じですか?

>>803
今回は特にタグの中身まではいじらない予定なので全角valueでもokです。

805:nobodyさん
11/10/12 00:03:54.71
>>801
すいません、スレ違いになってしまいましたが、ひとまずその方法を試してみました。
が、実体参照(&anpとか)が出てきたときにややこしいことになりそうです…orz
この場合だけ力技で切り抜けるか、もしくはやはりある程度正規表現で処理を
した方が良さそうな気がしますがどうでしょうか。

あるいはDOMの方が簡単なのでしょうか…?
どう回せばタグの中身が取り出せるのかいまひとつわからないです。。。

806:nobodyさん
11/10/12 00:21:33.58
あー…後から全角&XXX;を半角にするって方法もありますねえ…。
うーん。

807:nobodyさん
11/10/14 09:47:43.56 +/AP5o7r
htmlのソースからタグを除外するのに挑戦してて以下のようにしたんですが
もっと効率いいやり方あるでしょうか?

\<[a-zA-Z0-9\"\<\>\ \=\;\:\/\.\_\-\(\)\#\!\'\&\%]+

808:nobodyさん
11/10/14 15:25:07.10
どんだけ円がすきなのかとw

809:nobodyさん
11/10/14 15:26:32.18 i4T0D1ix
>>807
↓だと「Hello」ごと消えていかないか?
<p>Hello</p>
↓だと「…alt="」で止まってしまわないか?
<img src="hello.png" alt="こんにちは">

↓というわけでこれでいいんじゃないの。
<[^>]>

810:nobodyさん
11/10/14 15:28:56.11 i4T0D1ix
失礼「+」が抜けてた
<[^>]+>

811:nobodyさん
11/10/15 02:18:16.86 pl58b8lQ
フジテレビデモ
花王デモ
要チェック


812:nobodyさん
11/10/15 15:28:36.48
>>809
これは便利。ありがとう

813:nobodyさん
11/10/15 16:07:18.81
いいってことよ

814:809
11/10/15 18:11:07.01 5td5CFAR
>>813www

815:nobodyさん
11/11/01 16:59:25.75
行単位をダブルクオートで囲む正規表現で

ああああ文字列ああああ
いいいい文字列いいいい

検索
/^.*$/m

置き換え
"$0"

とした場合に
"ああああ文字列ああああ
"
"いいいい文字列いいいい
"

となってしまいます。"ああああ文字列ああああ"としたいのですが、どのようにすれば良いでしょうか
PHPのpreg_replaceを使っています。よろしくお願いします。

816:nobodyさん
11/11/01 17:49:42.69
マッチするないように改行が含まれてるから。

817:nobodyさん
11/11/01 18:23:24.87
>>815
自己レス
\x0Dが原因でした。

818:nobodyさん
11/11/01 22:17:43.68
>>817
>>816を無視するのか

819:nobodyさん
11/11/01 22:40:47.00
>>818

>>816
> マッチするないように改行が含まれてるから。

ではなくて
マッチするないように改行が含まれていなくても\x0Dが付加されるから

無視ではありません。

820:816 != 818
11/11/01 23:45:06.62
>>819
言い方が悪かったのかな。CRが含まれてるから。
別にCRは付加されたりしないよ。

preg_replace("/^([^\r]*)\r?$/m", "\\1", $text);
とするか、LFのみに変換してから処理するか。

821:nobodyさん
11/11/07 22:53:15.08
住所と番地の間にある空白を削除する場合どうやればいいですか?
「見附市 見附 123番地」この文字列を
「見附市 見附123番地」としたいです
「見附市」と「見附」の間の空白はそのままという条件付です

822:nobodyさん
11/11/08 00:28:51.98
数字が必ずある前提で、
\s[\d]

823:nobodyさん
11/11/08 01:11:57.96
(?!市).\s

824:nobodyさん
11/11/08 08:57:43.48
>>823
町や村にもヒットさせろよw
群はいらないか

825:nobodyさん
11/11/08 10:58:00.13
(東京都|北海道|(?:京都|大阪)府|[県市区群])\s+

\1

826:nobodyさん
11/11/08 10:58:59.04
ああ、勘違いした
>>825は流してくれ

827:nobodyさん
11/11/08 12:21:27.42
>>821
(?![市区町村]).\s

828:816 != 818
11/11/08 13:46:47.91
郡、な。

829:nobodyさん
11/11/08 20:01:17.27
しゅくちょく

830:nobodyさん
11/11/09 02:32:34.16
>>827
空白にマッチしたいんだから↓の間違いだよね。
(?<![市区町村])\s+


831:nobodyさん
11/11/23 06:53:59.84 V5f5mApl
![[
 文字列
 ![[別の文字]]
 ![[ほげほげ]]
]]

![[何か]]←これが1単位で、↑こんなの中から最短マッチで抽出したく、以下のようにしました。

$pattern = '/!\[\[([^\[\]]+)\]{2,2}?/';

しかしこの場合、ブラケットが使えないので困っています。

![[ この中に[←とか]←があると使えない ]]

最短マッチさせるにはどう書けばいいでしょうか?

832:nobodyさん
11/11/23 07:02:11.30
$pattern = '/!\[\[.+?]]{2,2}?/';


833:nobodyさん
11/11/23 09:23:16.47 V5f5mApl
>>832
ありがとうございます。
ちなみに↓こうでしょうか?
$pattern = '/!\[\[.+?\]{2,2}?/';

しかしながら、やはり最長マッチになってしまいます。
うっかり書き忘れたのですが、PHPのpreg_matchで行なっています。
PCRE準拠(Prel互換)らしいです。

834:nobodyさん
11/11/23 09:52:54.59 V5f5mApl
あ、すみません、できました!
が、1行だといけるのですが、複数行にまたがった場合失敗しました。
↓このような場合

![[
 文[字]列
 ![[別の文字]]
 ![[ほげほげ]]
]]

オプションにmやsを付けてみましたがダメです。

835:nobodyさん
11/11/24 01:59:39.52
>>834
入れ子の対応とりつつマッチするには
Subroutine Referencesを使えば良いよ。

<?php
$re = '/(?:!\[\[(?:(?!!\[\[)(?!\]\]).|(?R))*\]\])/s';
$text = "![[
  文[字]列
  ![[別の文字]]
  ![[ほげほげ]]
]]";
$position = array();
for ($i = 0; $i < strlen($text); $i++) {
  $pos = strpos($text, '!', $i);
  if (end($position) !== $pos)
    $position[] = $pos;
}
foreach ($position as $pos) {
  $t = substr($text, $pos);
  if (($pos === 0 || $pos) && preg_match_all($re, $t, $match, PREG_SET_ORDER)) {
    var_dump($pos); var_dump($t); var_dump($match); print "----\n";
  }
}
?>


836:nobodyさん
11/11/25 00:51:55.86 7pZprZ8q
>>835
うぉ!?ありがとうございます!

837:nobodyさん
11/11/25 01:08:56.26
>>835
おーこれでいけそうです!
なるほど、こんなやり方がありましたか。とても勉強になりました!


838:nobodyさん
11/11/27 21:48:09.61 ZbhJICcu
jsonの形式を配列に変換することは出来ないでしょうか?
phpのjson_decodeだと、どうやら変換エラーが出るようで、正規表現で解決できればと思うのですが。
{"xType":{"0":"main","1":"main","2":"main","3":"main","4":"main"},"xNum":{"0":"6","1":"6","2":"5","3":"5","4":"6"},"yType":{"0":"main","1":"main","2":"main","3":"main","4":"main"},"yNum":{"0":"5","1":"4","2":"4","3":"5","4":"5"}}
を[xType][0]=main,[xType][1]=main・・・・・的な感じなんですが。

どなたかお願いいたします。

839:nobodyさん
11/11/27 23:58:55.08
>>838
json_decodeでエラーが出ないんだけど

840:nobodyさん
11/11/28 08:12:12.66 NxvSoLFs
>>839
全体はもっと長いのですが...

841:nobodyさん
11/11/28 11:38:12.26
つーかエラーになるようなjsonモドキを吐く方をなんとかしろよ。

842:nobodyさん
11/11/28 11:51:50.21
>>840
なぜエラーの原因を特定しないのですか...

843:nobodyさん
11/11/28 11:52:31.97
あと、json形式でないものを、json形式だと思い込んで正規表現書いても結局うまくいかないとおもう。

844:nobodyさん
11/11/28 20:38:17.18 cgQZB7ih
{"1":{"0":{"n":{"xType":{"0":"main","1":"main","2":"main","3":"main","4":"main"},"xNum":{"0":"3","1":"5","2":"5","3":"3","4":"3"},"yType":{"0":"main","1":"main","2":"main","3":"main","4":"main"},
"yNum":{"0":"5","1":"5","2":"3","3":"3","4":"5"}}},"1":{"b":{"xType":{"0":"main","1":"main","2":"main","3":"main","4":"main"},"xNum":{"0":"5","1":"6","2":"6","3":"5","4":"5"},"yType":{"0":"main","1":"main","2":"main","3":"main","4":"main"},
"yNum":{"0":"5","1":"5","2":"4","3":"4","4":"5"}}},"2":{"l":{"xType":{"0":"main","1":"main","2":"main","3":"main","4":"main"},"xNum":{"0":"4","1":"5","2":"5","3":"4","4":"4"},"yType":{"0":"main","1":"main","2":"main","3":"main","4":"main"},
"yNum":{"0":"5","1":"5","2":"4","3":"4","4":"5"}}}}}
一応こんな感じのデータです。
json形式だと思うんですが、phpのほうでは

Syntax error, malformed JSON
とつれない回答です。

845:nobodyさん
11/11/28 21:06:49.29
>>844
デコードできたよ(PHP 5.3.2)

846:nobodyさん
11/11/28 21:16:33.29 cgQZB7ih
マジっすか??
デコードの仕方が悪いのでしょうか??
できればやり方を教えてください。

847:nobodyさん
11/11/28 22:13:12.05
こうならないためにもどんなデータをどうやったらエラーになったかを書くのが重要なんだけど。

848:nobodyさん
11/11/28 22:14:25.01
連レスすまんが、>>838をデコードするのとやり方は変えてないよ。
>>838はデコードできるんだろうから、環境面かもしれないよ

849:846
11/11/28 22:41:14.25 NxvSoLFs
単純にjavascriptの配列をjsonに変換させてからhidden属性に入力。
それをPOSTで送ったPHPファイルで
json_decode($_POST['hidden'])
って形でやってます。hiddenで送ること自体が間違い??
それともhiddenを何かに変換しなければいけないの??

850:nobodyさん
11/11/28 23:04:04.57
hidden属性とか$_POST['hidden']とか胡散臭そうなのが混ざってるし。
問題の切り分けの仕方について続けたいなら、くだ質とか、超初心者スレみたいなところでどうぞ

851:nobodyさん
11/11/29 23:04:45.51 gKGxmzY9
838は出来たけど、844は出来なかった。
同一ファイル上で変数を入れてみた結果として。

852:nobodyさん
12/01/01 16:05:26.90 vpch3S2x
整数の桁数上限なし、小数点以下2位までの少数をマッチさせたいのですがうまくいきません。

str.match(/[0-9]*.[0-9][1-9]/g)

どこが間違っているのか教えていただけますでしょうか。
PHP Version 5.2.16です

宜しくお願い致します。

853:nobodyさん
12/01/01 17:00:46.35
それはJavaScriptにしか見えないけど

854:nobodyさん
12/01/01 18:04:13.68 Zget/7Sh
>>852
本当にPHPだとすれば、あってるところのほうが少ない件
preg_match_all('/[0-9]*\.[0-9][0-9]/');

1/100の位は積極的にゼロを省かなきゃならないの?[0-9]でよくね?
あと、単なる整数とか、小数点以下3位以上の数字をどう扱いたいのかによっても変わってくる。
そもそも実際のところは「PHPで出力するHTMLに書かれたJavaScript」あたりかな?

855: 【大吉】 【1107円】
12/01/01 19:46:02.61
>>852
マッチさせる文字列が数値のみであれば、
数値判定をした方がいいのでは?

文字であっても強制的に数値に変換する等が可能であれば、
かなり楽です。

856:852
12/01/01 23:42:04.11
>853,854,855
大変失礼しました。
854さんのおっしゃる通り、「PHPで出力するHTMLに書かれたJavaScript」でした。

その理解すら不十分でした。申し訳ございませんでした。

857:nobodyさん
12/01/02 17:24:24.78
>>852
// 1 of 2
// 例として円周率pi
var value = "3.1415926";
var target = value;
// 小数部が無ければ、追加する
if (target.indexOf(".") < 0) {
 target = target.concat(".00");
}
var integral_part_1 = 0;
if (target > 0){
 integral_part_1 = Math.floor(target);
}else{
 integral_part_1 = Math.ceil(target);
}
//document.write(value," の整数部は ", integral_part_1, "<br>");


858:nobodyさん
12/01/02 17:25:16.42
>>852
// 2 of 2
// 小数第1位を取得
target = target - integral_part_1;
target = target * 10;
var integral_part_2 = 0;
if (target > 0){
 integral_part_2 = Math.floor(target);
}else{
 integral_part_2 = Math.ceil(target);
}
//document.write(value," の小数第1位部分は ", integral_part_2, "<br>");
// 小数第2位を取得
target = target - integral_part_2;
target = target * 10;
var integral_part_3 = 0;
if (target > 0){
 integral_part_3 = Math.floor(target);
}else{
 integral_part_3 = Math.ceil(target);
}
document.write(value," の小数第2位部分は ", integral_part_3, "<br>");


859:nobodyさん
12/01/06 21:48:56.02 b1y0AA6H
ここの皆さんのレベルでは簡単すぎるのかもわかりませんが教えてください
Firefoxブラウザのスクリプトで「Google Reader NG Filter」というものがあります
これはRSS文中に特定のキーワードが一致していれば自動的に削除するものです
サンプルとしてADとPRを消す正規表現がはじめから入っています
^\W?(?:ADV?|PR)\b
こういうものです
先頭にADやPRがあれば広告を見なくてもすむわけです

これを応用して見たくないキーワードが含まれているものを消すべく
自分なりに試行錯誤しているのですが上手くいきません
文中のキーワードなので当然^は不要ですし、正規表現のサイトで勉強して改変しても
動かないのです
iPhoneとAndroidというキーワードが含まれていたら削除するという表現をお願いします

860:nobodyさん
12/01/06 23:01:27.07 pwr91DzE
(?:iPhone|Android)でいいだろ。
上記にマッチした上で、本文を削除する部分もサンプルからコピペしないとダメだぞ。

861:nobodyさん
12/01/06 23:25:15.04
.*(iPhone|Android).*

862:nobodyさん
12/01/06 23:26:11.05
>>860
それやったけど、ダメでした…
普通はこれにしますよね

863:nobodyさん
12/01/07 00:03:18.47 n5aAiFGN
>>862
いや少なくとも>>860の正規表現はマッチするはずなので、たとえば
1. マッチさせる対象が本文ではなくタイトルになっている
2. 削除する処理がどうにかなっている
3. その他

864:nobodyさん
12/01/07 00:05:14.52
>>859
これか
URLリンク(userscripts.org)
親ルール,URL,他の条件にマッチしてないんじゃないか?
あと、大文字小文字をチェックしているとか

865:nobodyさん
12/01/07 00:56:55.41
>ここの皆さんのレベルでは簡単すぎるのかもわかりませんが教えてください
こんな枕詞はいらん。

866:nobodyさん
12/01/13 15:32:24.50 QW0sWV6a
<a href="URLリンク(example.com)"><img src="URLリンク(examle.com)"></a>

これで<a hrefがない場合に限り<img srcにマッチさせてURIを取得するにはどうすればいい?

preg_match_all('/(?:(?(?=<a href)|src))="([^"]+)/si', $html, $m);
だと<a hrefがあるときは<a hrefの部分は何もマッチしなくてsrcの方がマッチするみたい

867:nobodyさん
12/01/13 21:09:54.88
まず<a hrefがないというのが何処にないのか、土台をはっきりさせないと

868:nobodyさん
12/01/14 00:24:14.06
>>866
preg_match_all('|<img src="([^"]*)">(?!</a>)|')

869:nobodyさん
12/01/15 00:11:37.39
>>866
xhtmlが想定できるなら、正規表現よりxpath使った方が良いよ。
php.netにある例を改変すれば、$stringに文書が文字列化されてるとして、

$xml = new SimpleXMLElement($string);
$result = $xml->xpath('//img[name(..)!="a"]/@src');
while(list( , $node) = each($result)) {
    echo $node,"\n";
}

この場合だと親要素がaではないimg要素のsrc属性ってことが
直接表現できるからね。


870:nobodyさん
12/02/04 12:29:11.76
こちらのスレッドにはじめて投降します。よろしくお願いします。
・使用言語:java
・質問内容:漢字を余すことなく拾いたい。
※漢字を拾い出す正規表現をネットで調べていたのですが、
なにが新しくて、なにが不十分で、なにが正解なのかわからなくなってしまいました。




871:nobodyさん
12/02/04 18:34:56.81
漢字以外

872:nobodyさん
12/02/04 20:48:16.26
[\p{InCJKUnifiedIdeographs}
こういうのをみつけたのですが、これで網羅されているのでしょうか。

873:nobodyさん
12/02/05 12:00:52.66
URLリンク(code.cside.com)
ここらを見て漢字の含まれているグループを加えたらいいんじゃないかしら。拾っては困る文字があるなら
拾いたい漢字のコードポイントを列挙するしかないんじゃないかしら

「ああもう面倒 ! Unicodeに含まれる日本語で使われている漢字だけを拾う正規表現をここに書いてくんろ !」って
ことなら答えてもらえないと思うぞw

874:nobodyさん
12/02/05 13:17:26.57
>>873
面倒。。。という意味ではなく、漢字を含む文章を取り上げる正規表現を探していたのですが、
調べれば調べるほど種類があり、何を明記すれば過不足なく満足な結果を得られるのか分からなくなったので
質問した次第です。


875:nobodyさん
12/02/05 13:35:14.15
>>870
JIS X 0208またはJIS X 0213準拠の漢字コードでいいんじゃない?
JIS X 0208準拠なら URLリンク(charset.7jp.net) にあったよ。

876:nobodyさん
12/02/05 17:49:14.26
>>875
ありがとうございます。[亜-腕弌-熙]に加えて[纊-黑]もあるようですが、
\p{InCJKUnifiedIdeographs} または[一-龠]とは比べて量が異なるのか否か
使ってはいけないのかどうなのか、教えていただけると嬉しいです。

ちなみにwindows7、Microsoft(R) Office IME 2007 辞書ツール を使っています。

877:nobodyさん
12/02/05 19:33:01.78
>>876
コード表から検索すればすぐわかると思うんだけど…。
"一" で検索すれば 4e00 にあり、"龠" で検索すれば 9fa0 にあることがわかる。
\p{InCJKUnifiedIdeographs} は実装に依存するからJavaの仕様書を読んで、としか。
使ってはいけない、なんて判断指標もなしに判断できるわけがない。

878:nobodyさん
12/02/05 19:41:04.69
"JavaTM Platform Standard Ed. 6" には \p{InCJKUnifiedIdeographs} がないね。
URLリンク(java.sun.com)

879:nobodyさん
12/02/05 20:32:59.67
>>877>>878
返答、誠にありがとうございました。
自分の出した結論としては、\p{InCJKUnifiedIdeographs}がクラス Patternにはないこと、
亜は4E9C、黑は9ED1にあり、一と龠の位置よりも狭いことから(並びの順序が違うので一概には言えませんが)、
[一-龠]を使うのが一番妥当と判断しました。

皆様、本当にありがとうございました。


880:nobodyさん
12/02/17 21:31:06.69
質問です。ABCDEと5つの文字があり、複数の文中・文末に点在しています。

文中・文末にあるABCDEをマッチさせる正規表現を教えてください。
文頭はのぞきたいです。
ネットで調べたりしたのですが、どの言葉を用いると自分の要求する答えが
見つかるのか分からなかったので書き込みしました。
また自分で調べるためにも自己解決できるようなHPを教えていただけると嬉しいです。

よろしくお願いします。
JAVAを用いています。

881:nobodyさん
12/02/18 01:29:01.30
>>880
文頭は ^ か \n
マルチラインモードで動作しているかによって変わる

882:nobodyさん
12/02/18 07:45:28.55
>>881
マルチラインモードONだと思います。
それぞれの文章ごとに適用したいと思っています。

追記なのですが、
ABCDEが含まれていない文章も除きたいと考えています。
よろしくお願いします。

883:nobodyさん
12/02/18 10:11:57.59
>>882
もう答えは出ていると思うんだが…。
否定先読みと ^ を組み合わせればいい。
URLは>>878

884:nobodyさん
12/02/18 10:58:37.64
>>883
ありがとうございました。

885:nobodyさん
12/02/22 10:20:21.24
質問です。javaをしようしています。
ひらがな・カタカナ・アルファベット・記号で、連続ではない必ずまじりあった4文字以上の文章
を抜き出す正規表現を教えて頂けないでしょうか。よろしくお願いします。

886:nobodyさん
12/02/22 22:58:11.24
連続ではないまじりあった状態がどういうことなんだろう。
その4種を用いていればまじりあいそうな。
あアs# はどうなの。

887:nobodyさん
12/02/22 23:26:26.77
>>886
連続ではない必ず混じりあった4文字以上の文章とは
「ああああ」「アアアア」「aaaa」「◎◎◎◎」等連続した文章ではなく
「あアアa」とか「aaaの」とか「◎あアア」等の文章のことです。

分かりづらくすいません。


888:nobodyさん
12/02/22 23:50:16.43
>>887
それだけじゃ分かりにくい
例えば「アあアa」はどうなんの?

889:nobodyさん
12/02/22 23:59:54.01
>>888
「ひらがなだけ」「カタカナだけ」「アルファベットだけ」「記号だけ」の文章ではないのでマッチします。
「あいうえお」はひらがなが連続しているのでマッチしないようにお願いします。

890:nobodyさん
12/02/23 00:39:32.26
>>889
こんな感じ?

^(?:[a-zA-Zぁ-ゞァ-ヾ、-◯].{4,}|[a-zA-Zぁ-ゞァ-ヾ].{4,}|[a-zA-Zぁ-ゞ].{4,}|[ぁ-ゞァ-ヾ、-◯].{4,}|[ぁ-ゞァ-ヾ].{4,}|[ァ-ヾ、-◯].{4,})$

891:nobodyさん
12/02/23 00:45:45.26
>>890
表現していただき、本当にありがとうございました。
さっそく活用したいと思います。感謝します。

892:nobodyさん
12/02/23 01:57:09.70
>>891
ごめん890は流してくれ
なんか頓珍漢なこと書いてたわ

893:nobodyさん
12/02/23 02:20:18.23
>>892
いえいえ、謝られることなんて。

894:nobodyさん
12/02/23 09:38:55.66
1つの文字種だけでないならどこかに異なる2つの文字種が並ぶところがある筈
なので、あとは4文字以上の条件を満たすにはその並ぶところの前に2文字以上
あるか、前と後ろに1文字以上ずつあるか、後ろに2文字以上あるかのいずれか
である。

文字クラスをいちいち書くのはだるいのであ,ア,a,○で代表させると

[あアa○]{2,}あア[あアa○]*

みたいのを真ん中の文字種の順列×前と後ろの繰り返し数のパターン分だけ
つくって|で並べればOK


895:nobodyさん
12/02/23 10:34:55.79
>>894
「[あアa○]{2,}あア[あアa○]*」の真ん中の「あア」の部分を
「あア」「あa」「あ○」「アあ」「アa」「ア○」「aあ」「aア」「a○」
「○あ」「○ア」「○a」の12通り作って|で並べると解釈しましたがよろしかったでしょうか。

制作本当にありがとうございました。



896:nobodyさん
12/02/23 12:00:24.74
さらに前後の繰り返し数の場合わけで

[あアa○]{2,}あア[あアa○]*
[あアa○]{1,}あア[あアa○]{1,}
[あアa○]*あア[あアa○]{2,}


も必要だから12×3=36通り作って並べる


897:nobodyさん
12/02/23 12:03:30.20
真ん中だけ違うんだから

[あアa○]{2,}(あア|あa|….)[あアa○]*
[あアa○]{1,}(あア|あa|….)[あアa○]{1,}
[あアa○]*(あア|あa|….)[あアa○]{2,}

とした方が楽だな

898:nobodyさん
12/02/23 14:37:23.71
>>896>>897さま
追加補足ありがとうございます!

899:nobodyさん
12/02/23 17:00:23.37
PHP:5.3です。
URLの置換の質問です。
(preg_replace()でやるつもり)

URLリンク(aa.com)(適当な文字列) 複数あり

URLリンク(aa.com)
のようにしたいのですが、どのような正規表現を使ったらいいでしょうか?


よろしくお願いします。



900:nobodyさん
12/02/23 21:26:51.99
>>899
検索対象
index\.php[\?]+.+$
置換文字列
index.html

URLに含まれるphpファイルが複数存在する場合、GET変数(?以降の文字列)を強制的に除去したい場合
ただし、文中のあらゆる「?」から始まる単語が検索対象となってしまう。
検索対象
[\?]+.+$
置換文字列
index.html


901:nobodyさん
12/02/26 21:16:58.77
javascriptです。
検索文字列が"manga_index[0-9]+\.html"と"manga_ban_index[0-9]+\.html"
(例:manga_index52342.htmlとmanga_ban_index2.htmlでヒット)

manga_index[0-9]+\.htmlの場合はmanga_ban_index[0-9]+\.htmlとban_を追加し
manga_ban_index[0-9]+\.htmlの場合はmanga_ban_index[0-9]+\.htmlとそのままにしたいのですがどうすればいいのでしょうか?

902:nobodyさん
12/02/27 16:13:34.47
manga_index を manga_ban_index に置換すればいいんじゃないの

903:nobodyさん
12/02/29 06:23:11.44
使用言語問わず(?:foo|bar)と(foo|bar)の違いが判りません
自分が読むスクリプト言語の参考書では特に注釈もなしにfooかbarかどちらかに当てはまるものは(?:foo|bar)と書かれますが
初心者向けの正規表現についてのサンプルなど見ると(foo|bar)が多い気がします

どういう違いなのでしょう?初歩的な質問ですがよろしくお願いします

904:nobodyさん
12/02/29 14:42:57.64
>>903
()で囲むとあとから\1などで参照できます。
(?:)とするとその参照を切ることができます。
()でグループ分けをしたいけど参照はしない、というときにその設定をすると無駄がなくなります。

905:nobodyさん
12/03/01 17:23:10.26
>>904
今までよくわからないで()を使っていたので
これからはもっと良いものが書けそうです、ありがとうございます

906:nobodyさん
12/03/05 00:36:21.70
phpの正規表現で、特殊文字、こんなの→(?????)を区別したいんですが、どうすればよいでしょうか。
ざっくりした質問ですので、参考になるサイトを教えてくださる程度でも構いません。

907:906
12/03/05 00:47:40.35
文字化けしてますね。すみません。
特殊文字というのは、ミリとかリットルとか、特殊顔文字(読み方がわかりません。ハートとか。)で使われるものです。

908:nobodyさん
12/03/05 01:55:25.02
>>906
UTF-8で

909:nobodyさん
12/03/05 09:22:56.91
全部並べて文字クラスにすりゃいいだろ。正規表現以前の問題だな。


910:nobodyさん
12/03/10 02:43:47.72
479 名前:nobodyさん[] 投稿日:2012/03/10(土) 02:34:43.14 ID:/aJUja8G
文字列の正規表現で
「数値と英語と . と / と hoge 以外にマッチ」
というのをやりたいのですがどうも失敗してしまいます。一発での解決方法とかあるのでしょうか?

\Dやったあとまた\Wでマッチング、その後ドットでマッチングと物凄く効率悪い方法しか思いつかなかったのですが


911:nobodyさん
12/03/10 02:56:04.76
裏を返せば「数値か英語か . か / か hoge にマッチ」 したらnotマッチ

912:nobodyさん
12/03/10 03:17:32.46
>>911
貼ったの自分じゃないですがありがとうございます!
そういう考え方でいけばいいんですね

913:nobodyさん
12/03/20 19:40:54.01 Z+BjIxhL
javaの表現方法で
Bがあれば削除、ただし直前がAなら削除しない、かつB単体でも削除
という表現方法はありますか?
^[A]Bだと全体で2文字あることが前提のように解釈していますが間違っていますでしょうか。

914:nobodyさん
12/03/20 19:59:11.06
>>913
[^A]?Bかな

915:nobodyさん
12/03/20 20:10:18.04 Z+BjIxhL
>>914
マッチしました。ありがとうございます。

916:nobodyさん
12/03/21 02:09:27.32
[^A]

少し横向きの人が答えてるようで和んだ

917:nobodyさん
12/03/21 12:29:51.49
ああ、なるほど。と思ったけど ?があるから「はあ?」って言われてるとこ想像してしまい凹んだ

[^A]?

918:nobodyさん
12/03/26 23:29:49.84
「あいうえお」のいずれかが3回以上連続したらマッチってどうやればいいんでしょう?
[あいうえお]{3,}だと「あいう」とかにもマッチしちゃって駄目だった。

919:nobodyさん
12/03/26 23:37:31.05
>>918
([あいうえお])\1{2,}

920:nobodyさん
12/03/26 23:41:15.88
>>919
ありがとうございます!
解決してすっきりしました。

921:nobodyさん
12/03/28 18:04:07.49
すいません・・・。
>>913->>917の件にて、結果的にどのように表現すればよい結論になったのでしょうか。


922:nobodyさん
12/03/28 18:26:58.68
>>914だろ

923:nobodyさん
12/03/28 18:57:52.69
>>921
>>916>>917は顔文字みたいって言ってるだけやんw

924:nobodyさん
12/03/28 18:59:57.97
>>922>>923
ありがとうございます。
横向きの人、というのが理解できず失礼しました^^;

925:nobodyさん
12/03/29 12:43:34.53 UbmjoR9L
元テキスト:
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
URLリンク(maps.google.co.jp)

C#:
using System.Text.RegularExpressions;
text = Regex.Replace(text, @"(https?://[a-z.]+\.google\.[a-z.]+/[a-z]+\?).*?(q=[^&]*).*?(&tbm=[^&]*)?[a-zA-Z0-9-_./~*%$@:;,!?&=+#]*", "$1$2$3");

GoogleのURLをシンプル化したいのですが、上記コードだと「(&tbm=[^&]*)?」の部分が拾えません。
最後の?を取ると&tbmを含まないクエリでマッチしなくなります。
どうしたらいいでしょうか。

926:925
12/03/29 19:25:30.17 UbmjoR9L
>>925の問題を解決しつつ、少し進展しました。

text:
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
URLリンク(maps.google.co.jp)

C#:
text = Regex.Replace(text, @"(https?://[a-z.]+\.google\.[a-z.]+/[a-z]+)(?=.*[?&](q=[^&\s]*))(?=.*[?&](tbm=[^&\s]*))?[a-zA-Z0-9-_./~*%$@:;,!?&=+#]*", "$1?$2&$3");

やりたいこと:
googleのURLのうち、「q=」と「tbm=」の2種類の変数だけ取り出して残りを削ぎ落とす。
ただし、q/tbmの登場は順不同にも対応する。

困っていること:
「tbm=」がないURLでも、置換の第3引数に「&$3」を付けているために「&」だけ付いてしまう。
三項演算子で ("$3"=="")?"":"&$3" とかやろうとしたけど最初の"$3"を展開してくれないようで挫折。
1行追加して、「最後に&だけが付いてたら取り除く」しかないでしょうか。

927:nobodyさん
12/03/29 20:25:45.43
なんか大変そうだなぁ。
俺なら?で分割して、2個になったら2個目を&で分割して、q=とtbm=を取り出して終わるわ

928:nobodyさん
12/03/30 00:45:36.69
素直にライブラリ使った方が。
see HttpUtility.ParseQueryString()

929:925
12/03/30 13:55:15.20 Wpf4JXLP
>>927-928の言うとおりという気もしてきましたが、どうやら上手くいったのでご報告します。

C#:
text = Regex.Replace(text, @"(https?://[a-z.]+\.google\.[a-z.]+/[a-z]+)(?(?=\?tbm=)(\?(tbm=[^&\s]*).*?(&q=[^&\s]*))|((?=.*?[?&](q=[^&\s]*))(?=.*?(&tbm=[^&\s]*))?))[a-zA-Z0-9-_./~*%$@:;,!?&=+#]*", "$1?$2$3$5$6");

キャプチャ結果ではなく正規表現のほうに条件式を入れてどうにかできました。
ただし条件が複雑になると書き方がどんどん煩雑になるので拡張性はないかもしれません。

あと、どうも条件式をくくった部分で$4と$7をキャプチャ(両方とも常に空)しているようですが、
そこに(?:を足すと入れ子のカッコ内が全部キャプチャされなくなってしまったので、とりあえずこのまま。

930:nobodyさん
12/03/30 17:40:03.01
正規表現でがんばらなければだめな理由があるに違いないとそっと放置されるコード片が今まさに生まれたのである。

931:nobodyさん
12/04/12 15:38:18.00 nr7fN3uJ
個人の小さいメールマガジンスタンドをやっているのですが
秀丸エディタの正規表現を利用して帰ってきたエラーメールリストから
アドレスだけを抜き出したいのですがどうすればいいでしょうか?

具体的には
---------------------------
メールヘッダー

<abcdefghijklmno@ezweb.ne.jp>
---------------------------
というテキストがあって
<abcdefghijklmno@ezweb.ne.jp>の部分の
abcdefghijklmno@ezweb.ne.jpのみを取り出したいと思っています

よろしくお願い致します

932:nobodyさん
12/04/13 14:15:11.85
スレリンク(software板:162-164番)

933:nobodyさん
12/04/16 12:27:42.62
>>931
秀丸の正規表現スタイル判らないけど、
エディタの検索欄で特定の場所だけ抜き出すって結構大変だよ。
いっそ、perl、php、javascriptで書いた方が良いと思う

934:ゼッケン774さん@ラストコール
12/05/09 21:57:54.68 BzXqVbz5
不明

935:nobodyさん
12/05/10 11:31:59.11 uA0oypVx
質問です。javaを使用しています。
(?:[\((][一-龠]+[\))]*)
という正規表現をした際、括弧内にひらがなが含まれてしまうのですが、
含まれない漢字のみ括弧内に存在する表現方法を教えていただけないでしょうか。
お願いします。


936:nobodyさん
12/05/12 18:10:34.44
[\((](?!.*[ぁ-んァ-ヶヲ-゚0-9a-zA-Za-zA-Z0-9])はどうだろう。
しかし、「(笑)www」とかだめだよなあ。

937:nobodyさん
12/05/13 01:45:46.19
誘導されて来たんですけど、
こんなスレあったのね。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch