[php] \(半角バックスラッシュ)を文字列置換したい場合の注意点

Posted on

一時的に「!?」ってなったのでメモ。
文字列$nameに半角バックスラッシュが入っていた場合は、全角にしてやろうとした時のこと。

永井電子 ULTRA 3422-10 永井電子 レッドコード 3422-10 ウルトラ シリコンパワープラグコード

近辺で、似たような文字列置換をpreg_replace()で書いていたので
ここもpreg_replace()で書いたところ

エラーになります
PHP
1
2
3
//nameに半角バックスラッシュが入っていた場合は全角に変換
$name = preg_replace('/\\/u', '\', $name);
 

 

これだとエラーになってしまい KENDA ケンダ KOMET PLUS KR23 サマータイヤ 165/70R14 MONZA JP STYLE Baker ホイールセット 4本 14 X 5.5 +40 4穴 100、

永井電子 3422-10 ULTRA ウルトラ レッドコード シリコンパワープラグコード

永井電子 3422-10 ULTRA ウルトラ レッドコード シリコンパワープラグコード

ウルトラのパワープラグコードに交換するだけでパワーアップを実証!!
1.6Lで2.17馬力、2.0Lで3.8PS馬力アップ

【ウルトラシリコーンパワープラグコードの特徴】

■ギアポジションをリアルタイム表示

独自の演算方式により、ギアポジションをリアルタイムに大型赤色LEDインジケーターに表示します。 もちろんAT車でもギアポジションをリアルタイムに表示。マニュアル車に比べDレンジでは何速にシフトされているか判別しにくいAT車でこそ求められる機能として、AT車でのスポーツドライビングには欠かせないアイテムです。

■導電性の高い銅芯線を採用。

■車種ごとに開発された巻線固定抵抗の採用で、コードの長さに関係なく各気筒毎に均一した最大の火花エネルギーを引き出し、供給します。

■巻線抵抗はコード両端末のブーツの中に設け、雑音の発生源で効率よくノイズを消去します。

■ウルトラ独自のカシメ法と銅芯線によって卓越した引っ張り強度を実現。

■純粋シリコンゴムの採用によって 優れた耐候性と比類ない耐電圧特性を実現し、車の寿命を上回る耐久性を実証しています。等、まさに理想的な設計構造を採用しています。

永井電子 ウルトラ レッドコード

※商品の詳細や適合等は必ずメーカーホームページ等でご確認下さい。

【クレジットカード使用OK!】
【納期目安】2~14営業日での出荷

、$nameにはNULLが入ってしまうのです。

正解

そして、

正解
PHP
1
2
3
//nameに半角バックスラッシュが入っていた場合は全角に変換
$name = preg_replace('/\\\/u', '\', $name);
 

これならおkなんですね。

 

 

何故?

\ にマッチングさせる場合は \\ で良いんじゃないのか!?
なんでエスケープが1つ余計に必要なんだ?と思い
先輩方に疑問を投げたところ

推測だけど、 '/\\/u' の場合
2個目のバックスラッシュが正規表現最後のスラッシュ(デリミタ)をエスケープしてしまうからでは?

や 、

php側でのエスケープと WirusWin ステップマフラー FORZA(MF06) 《ウイルズウィン 212-08-01》 【割引クーポン配布中】ENDLESS/エンドレス SSM スカイライン HV37 HNV37 type-SP H26.2~ フロント 商品番号:EP461、PCREでのエスケープが2重でかかってるからなんだろうね。

等の回答を頂きました。なるほど。

 

preg_replace('/\\\/u', '\', $name);

↓ php的に\\が1つの\だと認識される

$nameに\\があった場合「\」に置換

↓ 正規表現的に\\が1つの\だと認識される

$nameに\があった場合「\」に置換

 

こういうことかー!

結論

そもそも、正規表現使ってない文字列置換でpreg_replace()使う必要無いよね?

PHP: str_replace – Manual にも

(正規表現のような) 技巧的な置換ルールを必要としない場合 コペン エアロ 2点 セット【ケーエルシー】コペン L880K 2点セット カーボンリップ/FRPディフューザー、 preg_replace() の代わりにこの関数を常用するべきです。

って書いてある。

…という訳で 30 セルシオ シートカバー【オートウェア】セルシオ UCF30系 C仕様Fパッケージ(本革シートのみ対応) シートカバー モダン ブラック、

永井電子 3422-10 ULTRA ウルトラ レッドコード シリコンパワープラグコード

結局…
PHP
1
2
3
//nameに半角バックスラッシュが入っていた場合は全角に変換
$name = str_replace('\\', '\', $name);
 

str_replace()に落ち着きました…

 

 

 

coding , ,