PHP5技術者認定試験(上級)に学ぶ、文字列との和解(2)

# PHP5技術者認定試験（上級）

資格試験に向けて勉強中です
勉強していて、PHPについて実は知らなかった／勘違いしていたことを記載します。


## 文字列

## 変数の展開

- ダブルクオーテーション `"` で括られた文字列内では変数・エスケープシーケンスが展開される
  - 変数展開時は `"my name is {$fullname}desu"` のように波括弧で括るのが無難
- シングルクォーテーション `'` は展開されない

## ヒアドキュメント

- 通常のヒアドキュメント
  - 書き方を忘れがち
  - EOSは **終端ID** と呼ばれる
  - 終端IDの前後にスペース、コメントなどを記載してはいけない

```php 
$string  = <<<EOS
６月２０日 {$schedule}
EOS; 
```

- Nowdoc (PHP5.3～)
  - EOSをシングルクォートで括る
  - 変数が展開されない

```php 
$string  = <<<'EOS'
６月２０日 {$schedule}
EOS; 
```

## 出力

### echo, print()

- echo と print() は構造言語
- echo は複数の引数をカンマ `,` 区切りで記述できる
-- その場合括弧で括ってはいけない

```php
echo $date, $schedule  ;
echo ( $date, $schedule ) ; // これはエラー
```
- print() は出力に成功した場合 `true` を返す

### print_r(), var_dump

- var_dump 
  - `,` で区切って複数の値を出力できる
  - 自分自身の参照を含むオブジェクト（ `$GLOBALS` など ）も出力可能
    - その際 `*RECURSION*` と表示される

## 操作

### trim( `$str`  [ `$charlist`  ] ), ltrim( `$str`  [ `$charlist`  ] ), rtrim( `$str`  [ `$charlist`  ] )

- 2パラ `$charlist`  は string
- デフォルトの除去文字は以下
	- 空白, タブ, 改行, キャリッジリターン, NULLバイト, 垂直タブ

### 他の操作関数

|関数名|機能|
|---|---|
|strtolower( `$str`  )|小文字変換||
|strtoupper( `$str`  )|大文字変換||
|ucfirst( `$str`  )|先頭を大文字変換||
|ucwords( `$str`  )|各単語の先頭を大文字変換||
|substr( `$str` , `$start` ,[ `$length`  ] )|文字を抜き出す||
|substr_count( `$heystack` , `$needle`  )| needleキーワードが何回出現するか ||
|substr_replace( `$str1` , `$str2` , `$index` , `$len`  )| `$str1` の `$index` 位置から  `$len` 分の文字を`$str2` に置換  ||
|strrev( `$str` )|逆から読む||
|str_repeat( `$str` , `$cnt`  )| `$str` を `$cnt` 回繰り返した文字列を取得  ||
|str_pad( `$str` , `$len` , `$pad`  = " " )| `$str` が `$len` 文字に達するまで、右に `$padを付加`  ||

## エンティティ

### エンティティ変換

- HTMLで意味を持つ文字をエスケープすることを **エンティティ** といいます。
	- 例：　`&` -> `&amp;`

|関数名|機能|comment|
|---|---|---|
|htmlentities( `$str` )|HTML特殊文字・ほか一部を、エンティティに変換|よくタイポされる|
|htmlspecialchars( `$str` )|HTML特殊文字を、エンティティに変換|上とほぼ同機能の関数|

- ほか一部： アクセント記号、ウムラウト付き文字

### 他の操作関数

|関数名|機能|
|---|---|
|strip_tags( `$str`  )|HTMLタグ・コメント、PHPタグを取り除く|
|get_meta_tags( `$filename` )|対処ファイルのHTMLメタタグを連想配列で取得|

## エンコード・エスケープ

|関数名|機能|
|---|---|
|urlencode( `$str` )|URLエンコード（クエリ文字列・クッキー値形式）|
|urldecode( `$str` )|上記をデコード|
|rawurlencode( `$str` )|URLエンコード（RFC3986形式）|
|rawurldecode( `$str` )|上記をデコード|
|addslashes( `$str` )|SQL用のエンコード **使うべきではない** |
|stripslashes( `$str` )|上記をデコード |

- addslashes()は 殆どのRDBMSで不向き。RDBMSに合わせたエスケープをしよう！


## 比較

- `==`, `===` どちらも **大文字小文字の区別を行う**
- `<` や `<=` 演算子での比較は、辞書順での比較を行う

|関数名|機能|
|---|---|
|strcmp( `$str1` , `$str2` )|辞書順で比較|
|strnatcmp( `$str1` , `$str2` )|自然順で比較|

## 分解・結合

|関数名|機能|
|---|---|
|explode( `$demiliter` , `$str` )|区切り文字で分割した配列を取得|
|implode( `$glue` ,(array) `$pieces` )|複数の文字列を結合|
|join( `$glue` ,(array) `$pieces` )|implodeのエイリアス|
|strtok( `$str` , `$token` )| `$token` で区切ったトークンを取得 、見つからない→ `false`|
|sscanf( `$str` , `$format` )|フォーマットに応じた値を読み取り、戻り値は配列|
|parce_url( `$url` )|URLを分割、戻り値は `["scheme"=>"http", "host"=>"qiita.com", "path" => "/mypage"]` |

- tokenはここではまとめきれない、使って覚える

## 検索

|関数名|機能|
|---|---|
|strpos( `$str` , `$keyword` )|検索文字列が最初に現れる位置を返す、見つからない→ `false`|
|strrpos( `$str` , `$keyword` )|検索文字列が最後に現れる位置を返す、見つからない→ `false`|
|strstr( `$str` , `$keyword` )|検索文字列から末尾までの文字列を返す|
|strchr( `$str` , `$keyword` )|検索文字列から末尾までの文字列を返す(上と同じ)|
|stristr( `$str` , `$keyword` )|検索文字列から末尾までの文字列を返す（大文字小文字を無視（i））|
|strrstr( `$str` , `$keyword` )|検索文字列が最後に現れる位置から末尾までの文字列を返す|
|strspn( `$str` , `$mask` )| `$mask` の文字のみで構成される部分が何文字あるか |
|strcspn( `$str` , `$mask` )| `$mask` の以外文字のみで構成される部分が何文字あるか |


## 終わりに

PHPよ、文字列関数の命名規則はどうにかならんかったのか

いいね！してくれると勉強が捗ります

- [第1回 関数](http://qiita.com/tmak_tsukamoto/items/84f7d62f6106fad5fd23)
- [第2回 文字列](http://qiita.com/tmak_tsukamoto/items/41673ab2d6fedeef0980)
- [第3回 配列](http://qiita.com/tmak_tsukamoto/items/2eb6d10e83b6c00981c9)