前提・実現したいこと
phpの置換関数 preg_replaceを使ってある範囲内の数値を置換したいのです。
下記に例題を記します。
●数値「1」~「300」までの範囲の数値を全て数値「0」に変えたい。
そして「301」~「900」までの範囲の数値を全て数値「1」に変えたい。
php
1$targetText = <<<EOT 2200 3300 4400 5EOT; 6 7$targetText = preg_replace('/1|299/',0,$targetText); 8echo $targetText;
正規表現の使い方がうまくいかずです、
phpに詳しい方、正しく動くソースをご教示願いますでしょうか、よろしくお願いいたします。
【追記】
●題名を[preg_replace]を使ってとしましたが、すっきりと解決ができるのでしたら、違う関数でも問題ございません。
●文字列は絶対に数字となります。数字の範囲は1~900です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/21 07:20

退会済みユーザー
2018/03/21 07:42

回答4件
0
2段階で処理するか、callbackで
- 2段階
PHP
1<?PHP 2$targetText = <<<EOT 31 410 599 6100 7200 8299 9300 10301 11400 12800 13899 14900 15901 161000 17EOT; 18 19$targetText = preg_replace('/^([0-9]|[1-9][0-9]|[12][0-9]{2}|300)$/m',0,$targetText); 20$targetText = preg_replace('/^([3-8][0-9]{2}|900)$/m',1,$targetText); 21echo $targetText;
- callback
PHP
1$targetText = <<<EOT 21 310 499 5100 6200 7299 8300 9301 10400 11800 12899 13900 14901 151000 16EOT; 17 18$targetText = preg_replace_callback('/^[0-9]{1,3}$/m',function($x){ 19 $ret=$x[0]; 20 if($ret<=300){ 21 $ret=0; 22 }elseif($ret<=900){ 23 $ret=1; 24 } 25 return $ret; 26},$targetText); 27echo $targetText; 28
投稿2018/03/22 04:03
総合スコア117605
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
php
1<?php 2 3$targetText = <<<EOT 4200 5300 6400 7EOT; 8 9$data = explode("\n", $targetText); 10 11foreach ($data as $val) { 12 if (intval($val) < 300) { 13 echo '0' . "\n"; 14 } else { 15 echo '1' . "\n"; 16 } 17}
で、ちゃんとpreg_match()
を使うと
php
1<?php 2 3$targetText = <<<EOT 40 51 62 73 810 920 1030 11100 12200 13300 14900 15EOT; 16 17$data = explode("\n", $targetText); 18 19foreach ($data as $val) { 20 if (preg_match("/^[012][0-9]{0,2}$/", $val) || preg_match("/^[3-9][0-9]?$/", $val) ) { 21 echo '0' . "\n"; 22 } else { 23 echo '1' . "\n"; 24 } 25}
0
0
0
0
0
0
0
0
0
1
1
preg_replace()
使ってみると
php
1<?php 2 3$targetText = <<<EOT 40 51 62 73 810 920 1030 11100 12200 13300 14900 15EOT; 16 17$patterns = array("/^[12][0-9]{2}$/m", "/^[3-9][0-9]{2}$/m", "/^[1-9][0-9]$/m", "/^[0-9]$/m"); 18$replacements = array('A', 'B', 'A', 'A'); 19$patterns_2nd = array('/^A$/m', '/^B$/m'); 20$replacements_2nd = array('0', '1'); 21 22$targetText = preg_replace($patterns, $replacements, $targetText); 23$targetText = preg_replace($patterns_2nd, $replacements_2nd, $targetText); 24 25echo $targetText;
0
0
0
0
0
0
0
0
0
1
1
PHP: 正規表現パターンに使用可能な修飾子 - Manual
/m
で複数行データでもヒットするようになります。
投稿2018/03/21 08:43
編集2018/03/21 12:05
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/03/21 09:30

0
お試しでやってみたw
php
1<?php 2$targetText = <<<EOT 3111 4200 5300 6301 7400 8900 9EOT; 10$patterns = ['/300/', '/[ 12][ \d]{2}/', '/[3-9]\d{2}/']; 11$replace = ['0', '0', '1']; 12$targetText = preg_replace($patterns, $replace, $targetText); 13echo $targetText;
指摘を受けての修正
php
1<?php 2$targetText = <<<EOT 30 41 511 6111 7200 8300 9301 10400 11900 12EOT; 13$patterns = ['/^300$|(?(?=(^\d{1,2})$)\d{1,2}$|^[12][\d]{2}$)/m', '/^[3-9]\d{2}$/m']; 14$replace = ['0', '1']; 15$targetText = preg_replace($patterns, $replace, $targetText); 16echo $targetText;
投稿2018/03/21 09:04
編集2018/03/21 12:57
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/03/21 09:06

退会済みユーザー
2018/03/21 09:07

退会済みユーザー
2018/03/21 09:10 編集

退会済みユーザー
2018/03/21 12:01

退会済みユーザー
2018/03/21 12:57

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。