-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtopic-post239.html
264 lines (243 loc) · 17.1 KB
/
topic-post239.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<title>日本PHPユーザ会 掲示板: PHP 5 » 正規表現のご相談</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="description" content="日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。" />
<meta name="keywords" content="php,web,php.gr.jp,community,usebb" />
<link rel="stylesheet" type="text/css" href="./templates/phpgrjp0.3/styles.css" />
<link rel="shortcut icon" href="./templates/phpgrjp0.3/gfx/usebb.ico" />
<link rel="alternate" type="application/rss+xml" title="日本PHPユーザ会 掲示板 RSS フィード" href="rss.xml" />
<script type="text/javascript" src="sources/javascript.js"></script>
</head>
<body onload="javascript:init_external()">
<div id="pagebox-bg">
<div id="shadow-left">
<div id="shadow-right">
<p id="logo"><a href="index.html"><img src="./templates/phpgrjp0.3/gfx/usebb.png" alt="UseBB" title="ホーム" /></a></p>
<h1 id="boardname"><span id="line">日本PHPユーザ会 掲示板</span></h1>
<h2 id="boarddescr">日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。</h2>
<div id="topmenu"><ul>
<li><a href="index.html">ホーム</a></li><li><a href="faq.html">FAQ</a></li><li><a href="active.html">活発なトピック</a></li>
</ul></div>
<div id="topmenu-shadow"></div>
<p class="locationbar">
• <a href="index.html">日本PHPユーザ会 掲示板</a> » <a href="forum-4.html">PHP 5</a> » 正規表現のご相談
</p>
<h3 id="forumname"><a href="topic-91.html">正規表現のご相談</a></h3>
<p id="forummods"></p>
<p id="toolbartop"> </p>
<p id="pagelinkstop">ページ: 1</p>
<table class="maintable">
<tr>
<th>投稿者</th>
<th>投稿</th>
</tr>
<tr class="tr1">
<td class="postername">
<div class="posternamecontainer"><a href="profile-132.html">kikuchi07</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post228.html#post228" name="post228" rel="nofollow">#1</a> 2008 年 9 月 22 日(月) 23:51</div>
</td>
</tr>
<tr class="tr1">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 9 2008</div>
<div class="field">返信数: 5</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">はじめて投稿させていただきます。<br />仕事でPHPとMySQLを使い始めたのですが、DBから取得したテキスト文字列のなかに含まれる数字を数字が1桁なら全角に、2桁以上なら半角にしなければならないのですが、これを簡単に実現できる方法等ご存知の方いらっしゃいませんでしょうか?<br />mbereg_replaceでいろいろやってはみたものの、置換文字列が1文字ではないため、1文字ずつ取りだして比較していくしかないのかなぁと思っています。。。</div>
</td>
</tr>
<tr class="tr2">
<td class="postername">
<div class="posternamecontainer"><a href="profile-134.html">adachi</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post229.html#post229" name="post229" rel="nofollow">#2</a> 2008 年 9 月 24 日(水) 0:27</div>
</td>
</tr>
<tr class="tr2">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 9 2008</div>
<div class="field">返信数: 3</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">1.すべて全角にする<br />2.正規表現で二文字以上のものだけ半角にする<br />って手順でできませんか?<br />全角と半角はもちろん逆でも良いのですが、正規表現では1桁を表現するより2桁以上を表現するほうが容易です</div>
</td>
</tr>
<tr class="tr1">
<td class="postername">
<div class="posternamecontainer"><a href="profile-134.html">adachi</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post231.html#post231" name="post231" rel="nofollow">#3</a> 2008 年 9 月 24 日(水) 0:49</div>
</td>
</tr>
<tr class="tr1">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 9 2008</div>
<div class="field">返信数: 3</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">上の発言は無視してくださいorz<br />文字コードがスクリプトとデータベースで同じと仮定してですが、preg_replace_callback一発がベターですね<br />pregシリーズはバイナリーデータに対応しているので123がそのまま使えます。<br />とはいえ文字コードによってはいろいろ複雑なものがあるようですが・・・<br /><pre class="code">preg_replace_callback("/(?:\d|0|1|2|3|4|5|6|7|8|9)+/", 'callback', ....)<br />function callback($match)<br />{<br /> if (....<br />}<br /></pre><br /><a href="http://jp.php.net/manual/ja/function.preg-replace-callback.php" title="http://jp.php.net/manual/ja/function.preg-replace-callback.php" rel="external">http://jp.php.net/manual/ja/function.preg-replace-callback.php</a><br /><a href="http://jp.php.net/manual/ja/regexp.reference.php" title="http://jp.php.net/manual/ja/regexp.reference.php" rel="external">http://jp.php.net/manual/ja/regexp.reference.php</a></div>
</td>
</tr>
<tr class="tr2">
<td class="postername">
<div class="posternamecontainer"><a href="profile-36.html">kona@m</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post233.html#post233" name="post233" rel="nofollow">#4</a> 2008 年 9 月 24 日(水) 8:48</div>
</td>
</tr>
<tr class="tr2">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 10 2007</div>
<div class="field">返信数: 71</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">(まだ試してないのですが)もし自分がやるとしたら、<br />(1) 一旦、<a href="http://jp2.php.net/manual/ja/function.mb-convert-kana.php" title="http://jp2.php.net/manual/ja/function.mb-convert-kana.php" rel="external">mb_convert_kana()</a>で数字だけを全部半角にしておく。<br />(2) <a href="http://jp2.php.net/manual/ja/function.preg-replace.php" title="http://jp2.php.net/manual/ja/function.preg-replace.php" rel="external">preg_replace()</a>の<a href="http://http://jp2.php.net/manual/ja/reference.pcre.pattern.modifiers.php" title="http://http://jp2.php.net/manual/ja/reference.pcre.pattern.modifiers.php" rel="external">e修飾子</a>指定で、「1桁の数字」をmb_convert_kana()で全角にして置換する。<br />という方法ですが、どうでしょうか。<br /><br />adachiさんのおっしゃる通り、内部文字エンコーディングがUTF-8かEUC-JPならば、全角文字でもpregシリーズが使えてしまうみたいですね。</div>
</td>
</tr>
<tr class="tr1">
<td class="postername">
<div class="posternamecontainer"><a href="profile-134.html">adachi</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post234.html#post234" name="post234" rel="nofollow">#5</a> 2008 年 9 月 25 日(木) 0:43</div>
</td>
</tr>
<tr class="tr1">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 9 2008</div>
<div class="field">返信数: 3</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">e修飾子なんてのがあったのか・・・これは便利ですね<br />勉強になります</div>
</td>
</tr>
<tr class="tr2">
<td class="postername">
<div class="posternamecontainer"><a href="profile-132.html">kikuchi07</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post237.html#post237" name="post237" rel="nofollow">#6</a> 2008 年 9 月 25 日(木) 16:37</div>
</td>
</tr>
<tr class="tr2">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 9 2008</div>
<div class="field">返信数: 5</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">みなさん、ご回答ありがとうございます。<br /><br />callbackについては、書籍等にも正規表現とか軽くさわる程度しかのっていなかったりして、よくわかっていませんが少し時間のあるときにいろいろためしてみようと思います。<br /><br />いまの環境は元データがUnicode文字が含まれておりましたので、UTF-8でDB構築しており、内部エンコーディングもすべてUTF-8となっております。<br /><br />わたしもkona@mさんのようにmb_convert_kanaで数字だけ全部半角にしてからと考えていたのですが、置換文字列をどうしたものか頭を悩ませておりました。preg_replace なんて関数あったんですね。。。知りませんでした(mb_ereg_replaceでなんとかしようとしてました)。e修飾子についても知らなかったので少し調べてみます。<br />後日、結果をご連絡したいと思います。<br /><br />また、じつはもう1ついま悩んでいるところがあって、日本語文である文章のなかに句読点があって、これらを全角にしなければならないのですが、数字の桁区切りは半角でなくてはならないのです。<br />それで、MIFES とかで調べて以下だと置換できたのですが、PHPだと思った通りにならない状態です。いまいちPHPでの正規表現の書き方がよくわかっていないので、地方に住んでるので書籍を取り寄せ注文していて届くまではなんとか試行錯誤しないといけません。<br /><br />検索文字列:{[0-9]+}{[,]}{[0-9]+}<br />置換文字列:\1,\3<br /><br />PHP では以下のようにしてみたのですが、なにか書き方が違うのでしょうか?<br /><br />$data = mb_ereg_replace("{[0-9]+}{[,]}{[0-9]+}", "\\1,\\3", $data);<br /><br />正規表現で難しいですね。。。仕事が一段落したらちゃんと覚えなおさないといけないなと思ってるところです。</div>
</td>
</tr>
<tr class="tr1">
<td class="postername">
<div class="posternamecontainer"><a href="profile-132.html">kikuchi07</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post238.html#post238" name="post238" rel="nofollow">#7</a> 2008 年 9 月 25 日(木) 16:59</div>
</td>
</tr>
<tr class="tr1">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 9 2008</div>
<div class="field">返信数: 5</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">すみません、さきほどの数字の桁区切りのカンマは以下のようにして自己解決しました。<br /><br />$string = "1,200件以上";<br />$pattern = '/(\d+),(\d+)/';<br />$replacement = '${1},$2';<br />echo preg_replace($pattern, $replacement, $string);<br /><br />1桁数字の全角、2桁以上半角にするほうがんばってみま・x・</div>
</td>
</tr>
<tr class="tr2">
<td class="postername">
<div class="posternamecontainer"><a href="profile-36.html">kona@m</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post239.html#post239" name="post239" rel="nofollow">#8</a> 2008 年 9 月 25 日(木) 19:29</div>
</td>
</tr>
<tr class="tr2">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 10 2007</div>
<div class="field">返信数: 71</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">思ったより試行錯誤してしまいましたが、こんな感じでできました。<br /><br /><pre class="code">$s = '0)テスト123です。1と2と345です。999';<br /><br />$s = mb_convert_kana($s, 'n');<br />$s = preg_replace('/(^|\D)(\d)(\D|$)/e', '"$1".mb_convert_kana("$2", "N")."$3"', $s);<br /><br />echo $s;</pre><br />いかがでしょうか?<br />(先頭または数字以外)と(末尾または数字以外)にはさまれた(1文字の数字)を検索し、変換して置換します。この時(先頭または数字以外)と(末尾または数字以外)も置換対象になってしまうので、そのまま数字の前後にくっつけて返すのがポイントです。<br /><br />それと、前の私の投稿で「全角文字でもpregシリーズが使えてしまう」と書きましたが、「全角文字でも<strong>工夫次第で</strong>pregシリーズが使えてしまう」に訂正させて下さい。<br />確か /[あいう]/ はうまくいかなくて /[(あ)(い)(う)]/ にする必要があります。日本語だと1文字に見えても実際には2バイト以上の並びとして扱う必要があるようです。<br />その点、mb_eregシリーズの利点が見えてきます。(私はあまり使ったことがないので詳しくないのですが。)</div>
</td>
</tr>
<tr class="tr1">
<td class="postername">
<div class="posternamecontainer"><a href="profile-132.html">kikuchi07</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post241.html#post241" name="post241" rel="nofollow">#9</a> 2008 年 9 月 26 日(金) 20:09</div>
</td>
</tr>
<tr class="tr1">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 9 2008</div>
<div class="field">返信数: 5</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">kona@m さん、ありがとうございます。<br /><br />正規表現の「(先頭または数字以外)と(末尾または数字以外)も置換対象になってしまう」というところがよくわからなかったのですが、数字以外で挟まれた場合はイメージがつくのですが、先頭と末尾に関してはなぜ変換対象となるのかがどういう動作原理なんだろうと思ってしまいました。<br />$1と$3が先頭と末尾だと思うのですが、いろいろ考えたのですがよくわかりませんでした。<br /><br />とりあえずいただいたコードをテストしてうまくいっていることが確認できましたのでとても助かりました。ただ、文字列のなかで句読点「、。」は半角・全角問わず「,。」の全角文字に変換しなくてはならず、3桁数字のものは半角にしなくてはなりませんでしたので以下のコードにしてみました。<br /><br />$string = "小学校5,6年1,200名以上のなかから50人を選出する。";<br /><br />$string = mb_convert_kana($string, "n");<br /><br />$string = mb_ereg_replace(",", ",", $string);<br />$pattern = '/(\d+),(\d{3})/';<br />$replacement = '$1,$2';<br />$string = preg_replace($pattern, $replacement, $string);<br /><br />$pattern = '/(^|\D)(\d)([^0-9,]|$)/e';<br />$replacement = '"$1".mb_convert_kana("$2", "N")."$3"';<br />$string = preg_replace($pattern, $replacement, $string);<br /><br />print $string."<br>";<br /><br />なんか効率が悪いような気もしますが、このような感じでだいじょぶでしょうか?テストして問題はなさそうですがあまり自身ないです。また、もっとスリムにできそうなコードであれば助言いただければ嬉しいです。</div>
</td>
</tr>
</table>
<p id="toolbarbottom"> </p>
<p id="pagelinksbottom">ページ: 1</p>
<div id="bottomfix"></div>
<p id="actionlinks"></p>
<p class="locationbar">
• <a href="index.html">日本PHPユーザ会 掲示板</a> » <a href="forum-4.html">PHP 5</a> » 正規表現のご相談
</p>
<p id="linkbar">
</p>
<p id="bottom">
日本PHPユーザ会 掲示板 は <a href="http://www.usebb.net">UseBB 1 フォーラムソフトウェア</a> を使用しています
</p>
<div id="bottom-shadow"></div>
</div>
</div>
</div>
</body>
</html>