只今、PHP勉強中です。


置換処理で
一番最初を<br>を<br01>
2番目を<br>を<br02>
3番目を<br>を<br03>
・・
以下同様に文章最後まで番号を振って
行きたいのですが
参考になるサイトやスクリプトがあったらお教えくださいませ。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/11/21 13:40:15
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tdoi No.1

回答回数174ベストアンサー獲得回数75

ポイント50pt

こんな感じ?

<?php
$str = <<< INPUT
<html>
  <body>
    <br>
    <div>foo<br>foo</div>
      <div>
        <div>bar<br>bar</div>
      </div>
    <br>
  </body>
</html>
INPUT;

$target = "<br>";
$format = "<br%02d>";

$index = 1;
do {
  $tag = sprintf($format, $index);
  $count = 0;
  $str = preg_replace("/{$target}/s", $tag, $str, 1, $count);
  ++$index;
 } while ($count == 1);

echo $str;
?>

そのまま実行すると、こんな出力が得られます。

<html>
  <body>
    <br01>
    <div>foo<br02>foo</div>
      <div>
        <div>bar<br03>bar</div>
      </div>
    <br04>
  </body>
</html>

str_replaceで十分だと思ったんですが、str_replaceにはlimit指定できないんですね~。
何かの参考になれば。

id:tdoi

windofjulyさんのがスマートな気がしてしまったので、もうひとつ泥臭いのをw

$target = "<br>";
$format = "<br%02d>";

$elements = explode($target, $str);
$result = $elements[0];
for ($i = 1; $i < count($elements); ++$i) {
  $result .= sprintf($format, $i) . $elements[$i];
}
echo $result;
2011/11/15 17:24:33
id:admn

ありがとうございました。
皆様の意見を参考に解決しました。

2011/12/08 15:02:31

その他の回答2件)

id:tdoi No.1

回答回数174ベストアンサー獲得回数75ここでベストアンサー

ポイント50pt

こんな感じ?

<?php
$str = <<< INPUT
<html>
  <body>
    <br>
    <div>foo<br>foo</div>
      <div>
        <div>bar<br>bar</div>
      </div>
    <br>
  </body>
</html>
INPUT;

$target = "<br>";
$format = "<br%02d>";

$index = 1;
do {
  $tag = sprintf($format, $index);
  $count = 0;
  $str = preg_replace("/{$target}/s", $tag, $str, 1, $count);
  ++$index;
 } while ($count == 1);

echo $str;
?>

そのまま実行すると、こんな出力が得られます。

<html>
  <body>
    <br01>
    <div>foo<br02>foo</div>
      <div>
        <div>bar<br03>bar</div>
      </div>
    <br04>
  </body>
</html>

str_replaceで十分だと思ったんですが、str_replaceにはlimit指定できないんですね~。
何かの参考になれば。

id:tdoi

windofjulyさんのがスマートな気がしてしまったので、もうひとつ泥臭いのをw

$target = "<br>";
$format = "<br%02d>";

$elements = explode($target, $str);
$result = $elements[0];
for ($i = 1; $i < count($elements); ++$i) {
  $result .= sprintf($format, $i) . $elements[$i];
}
echo $result;
2011/11/15 17:24:33
id:admn

ありがとうございました。
皆様の意見を参考に解決しました。

2011/12/08 15:02:31
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント25pt

コールバック関数を使った例を作ってみました

<?php
$text = 'aaa<br>bbb<br>ccc<br>ddd<br>eee';
$count = 0;
echo preg_replace_callback('!(<br)(.?>)!', create_function('$matches','global $count; $count++; return $matches[1] . sprintf("%02d", $count) . $matches[2];'), $text);

http://php.net/manual/ja/function.preg-replace-callback.php

id:admn

ありがとうございました。
皆様の意見を参考に解決しました。

2011/12/08 15:02:37
id:a-kuma3 No.3

回答回数4971ベストアンサー獲得回数2153

ポイント25pt

こんな感じでしょうか。

<?php
$num = 0;
$txt = <<<DATA_TEXT
A<br>
B<br>
C<br>
D<br><br>
E<br>
DATA_TEXT;
 
echo preg_replace_callback(
    '|(<br)(>)|',
    create_function (
        '$match',
        'global $num; $num += 1; return $match[1] . sprintf("%02d", $num) . $match[2];'
    ),
    $txt);
?>

ideone.com で、動作の確認をしています。
http://ideone.com/hY3Qa


実は、あまり PHP を知りません (^^;
なので、先程のコードを書くのは、マニュアルと首っ引きです。

参照したのは、PHP Manual の以下のページで、参照した順番に並べてます。
PHP: preg_replace_callback - Manual
PHP: 文字列 - Manual
PHP: 変数のスコープ - Manual
PHP: sprintf - Manual


やっぱり、基本はマニュアルだと思いますよ。
PHP のは、サンプルコードもいっぱい載ってますし。

id:a-kuma3

モタモタ...

2011/11/15 17:21:51
id:admn

ありがとうございました。
皆様の意見を参考に解決しました。

2011/12/08 15:00:43

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません