PHP関数
ゲスト
ゲスト
ATOMRSS
  • コード求むID: 336
  • 登録日時:  2008/10/16 12:06
  • 最終更新日時: 2008/10/18 19:50
  • アクセス数: 317
  • タグ: 
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加

phpで以下の事を実地させたいです。

文字列$verをaで区切りたい。
explode関数でaを指定すると、「b,n,n」となりますが、aも残したい。
つまり、「ba,na,na」としたいです。

関数または、ロジックをご教授下さい。

$ver "banana";


コメント

  • ゲスト
  • 1:ゲスト
  • 2008/10/16 17:17

たとえば、

$val = "baaaaaanaaana";
の時とか、どうしたいのですか?

GJ

  • ゲスト
  • 2:ゲスト (ぱ)
  • 2008/10/16 17:49

こんな感じですかねぇ

$ver = "aabacadaea";
$tmp = strtr($ver, array("a"=>"a,"));
echo preg_replace("/,$/", "", $tmp);
「a」を「a,」に置換し、末尾に「,」があった場合は削除すると。

  • GoodJob
  • 0

  • ゲスト
  • 3:ゲスト
  • 2008/10/16 18:09

適当に書くとこんな感じ

function converter($str)
{
    $pattern = "/[b-z]*a/";
    preg_match_all($pattern, $str, $matches[]);
    return $matches[0][0];
}

$str = "banana";

print_r(converter($str));

/*
 *Array
 *(
 *    [0] => ba
 *    [1] => na
 *    [2] => na
 *)
 */

GJ

  • ゲスト
  • 4:ゲスト (E)
  • 2008/10/16 18:33

ぱっと思いついたもの2つ。

1.文字列を一文字ずつ配列に入れて全文字走査(区切り文字が1文字に限る)

function myExplode($separate, $string) {
    // str_splitはPHP5以上?
    if (function_exists(str_split)) {
        $tmpArray = str_split($string);
    } else {
        $strLen = strlen($string);
        for ($ii = 0; $ii < $strLen; $ii++) {
            $tmpArray[] = substr($string, $ii, 1);
        }
    }
    $count = count($tmpArray);
    for ($ii = 0; $ii < $count; $ii++) {
        $tmpString .= $tmpArray[$ii];
        // 区切り文字が現れたらreturn用配列に格納し、一時文字列変数をクリア
        if ($tmpArray[$ii] == $separate) {
            $returnArray[] = $tmpString;
            unset($tmpString);
        }
    }
    // あまりがあったら最後に入れる。
    if ($tmpString) {
        $returnArray[] = $tmpString;
    }
    return $returnArray;
}
2.区切り文字が現れた位置までを取得していく(区切りが2文字以上でもOK)
function myExplode($separate, $string){
    $strLen = strlen($separate);
    while ($string) {
        $pos = strpos($string, $separate);
        // 見つかったら頭からその位置までをreturn用配列に格納しそれ以降を再調査
        if ($pos !== false) {
            $returnArray[] = substr($string, 0, $pos + $strLen);
            $string = substr($string, $pos + $strLen);
        } else {
            // 見つからなかったらそのまま格納
            $returnArray[] = $string;
            unset($string);
        }
    }
    return $returnArray;
}
ともにマルチバイトは非対応です(多分)
正規表現も使えそうだったけど渡す文字&区切り文字によってパターンを変えないといけなそうなのでぱっと浮かびませんでした。。。

  • GoodJob
  • 0

こんな時こそPerl互換正規表現でさくっと。

function explodeRemainSep($sep, $str) 
{
  $sep = preg_quote($sep, '/');
  return preg_split("/(?<=$sep)/", $str);
}

print_r(explodeRemainSep('a', 'banana'));
出力:

Array
(
    [0] => ba
    [1] => na
    [2] => na
    [3] =>
)

GJ

  • ゲスト
  • 6:ゲスト (BLUEPIXY)
  • 2008/10/17 23:48

$res = Array();#結果格納用配列
$str="banana";
$wk = preg_split('/(a)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
while($wk){
	array_push($res, array_shift($wk) . array_shift($wk));
}

print_r ($res);#結果の表示

GJ

  • kaz
  • 7:kaz
  • 2008/10/18 19:50

「a」で区切っているなら、区切った後のものに必ず「a」を追記すればそれで同じなのでは。。。

元の文字列の末尾が「a」かどうかの評価は必要ですね。

GJ

前へ 1 次へ

コメントする

[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。

[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。

ゲスト投稿者:ゲスト:

関連ソースコード・ノウハウを登録

PDFLib | A library for processing PDF on the fly プレゼン公開・共有サイト handsOut.jp オープンタイプ株式会社 チーム・マイナス6% - みんなで止めよう温暖化

ブックマークコメント