文字列分割・置換

正規表現が不要な場合、文字列分割にはexplode()関数を使うそうです。

explode( 分解文字, 文字列, [分解数] )


PHPリファレンス(split()、spliti()、explode())
 http://www.php-ref.com/bapi/02_split.html

文字列の空白を削除する関数なんてのもあるんですね。便利便利

trim( 文字列 [, 削除リスト] )


PHPリファレンス(trim()、ltrim()、rtrim()、chop())
 http://www.php-ref.com/bapi/02_trim.html

正規表現が不要な場合、文字列の検索置換にはstr_replace()関数を使うそうです。
正規表現が必要な場合は文字列の検索置換にはpreg_replace()関数を使うそうです。
strtr()関数もあるけど、あまり使わなさそうかな。

「検索及び、置き換え文字列に配列を指定した場合は各要素に対応して検索と置き換えが行われ」るのは便利ですね。

str_replace ( 検索文字列, 置換え文字列, 対象文字列 );


▽str_replace-文字列関数 (初心者のPHP入門)
 http://php.quus.net/strings/str_replace.php


PHP: preg_replace - Manual
 http://php.benscom.com/manual/ja/function.preg-replace.php


しかし、デリミタが必要なのを見落として、

Delimiter must not be alphanumeric or backslash


なんてエラーを吐かれてしまいました(><。。
以下の記事をみて納得。


正規表現とデリミタとエスケープ - 徒書
 http://www.akatsukinishisu.net/itazuragaki/perl/regex_delimiter_escaping.html



preg_replace()の第一引数はデリミタが必要。
ちなみに配列を、配列で検索して、配列で置換する場合、デジミタは配列側で与えないと、preg_replace()の式の中で与えるとうまく動かなかったです。きっとなにか決まりがあるんでしょうね……正確な原因はどこかで知っておきたいです。

あとは正規表現と他の値とがごちゃごちゃにならないように、デミリタというか、パターン?を区切るために()で区別してあげる必要があるみたい。ここもなかなか気付かず、難儀しました。

また正規表現の$1とか$2は後方参照っていうのね(言葉をしらなかった)。
\$1または\\1とかけ、とありますね。


Perl 互換の正規表現にマッチした部分を置き換える (PHP 標準関数逆引き辞典)
 http://always-pg.com/php/std_rd/regex/preg_replace.html



毎朝お世話になっている早起き生活の開発者さんのblog。
日本語を正規表現検索するときは文字コード周りで色々面倒が起きるらしい。

パターン修飾子「u」を指定しなさい、って書いてありますね。なるほど。


▽ネットサービス運営日誌: [PHP] mb_ereg()じゃない、preg_match_all()に/uをつけるんだ!
 http://ifs.seesaa.net/article/26300967.html



修飾子関係でもうひとつ。

// □検索条件
$search = array(
"{初([2-5])9}eu",
"{仲([2-5])9}eu",
"{晩([2-5])9}eu",
);
// □置換条件
$replace = array(
"'\$1'.'2'",
"'\$1'.'5'",
"'\$1'.'8'",
);

$olddate = preg_replace($search, $replace, $desc);
※$descは、初春、仲夏、晩秋等の季節(の部分を2桁の数字に置き換えたもの
(春=29、夏=39、秋=49、冬=59)


こんなコードで、10の位はそのままにして、1の位を初=2、仲=5、晩=8に置き換えて2桁の数字にしようとした場合(わかりにくい例だな、しかし)、e修飾子をつけないと、PHPコードとして扱われないから、.で結合できないんですね。
e修飾子が「PHP コードとして評価」される云々は、何度もみていたのですが意味がわかっていませんでした。この修飾子を使えばいいということに気付くまでめちゃめちゃ時間かかりましたよ(><。。。

e (PREG_REPLACE_EVAL)
この修飾子を設定すると、preg_replace() は、置換文字列において後方参照に関する通常の置換を行った後、 PHP コードとして評価し、検索文字列を置換するためにその結果を 使用します。 置換された後方参照においては、 単引用符や二重引用符、バックスラッシュおよび NULL 文字は バックスラッシュでエスケープされます。
この修飾子を使用するのは、preg_replace()のみです。 他の PCRE 関数では無視されます。


▽パターン修飾子 (PHPマニュアル)
 http://php.benscom.com/manual/ja/reference.pcre.pattern.modifiers.php

意味が全部わかって書いているわけじゃないから、どうしてこうなるの?を見つけるのに苦労しますね。
まぁ本を読みながら順を追って……じゃ、頭に入らないのでやむをえないです。

一通りなんとか作ってみて、あとで概説書をざっと眺めれば意味がようやくわかるでしょう。多分。