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

Posted on

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

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

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

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

 

これだとエラーになってしまい エンケイ/ENKEI ホイール Racing RS05 国産車用 18インチ サイズ:7 1/2J INSET:50 H-P.C.D.:5-100 穴径:φ75 カラー:Chiaro Silver、

永井電子 3422-10 ULTRA ウルトラ レッドコード シリコンパワープラグコード
新商品★POTENZA S007A 255/35R20 97Y XL★2018年7月発売開始★正規品★!リーフ用 ストライプLHセツトリーフ G6822-3NA00 日産純正部品.レクサス NX200t 300h パーツ リアウィンドウモール カスタムパーツ LEXUS NX 社外品,CALMAT(キャルマット) フロアマット 日産 ノート 17年1月~24年9月 -スポーツチェック グレー

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

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

正解

そして、

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

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

 

 

何故?

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

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

や 、

php側でのエスケープと ACRE ブレーキパッド ■アクレ フォーミュラ800C リア 【品番:375】 トヨタ マーク2・クレスタ・チェイサー GX115 (4WD) 00.10~04.11 [ACRE] アクレ ブレーキパッド フォーミュラ800C フロント用 フォルクスワーゲン ゴルフプラス 1.6 E 1KBLP 05.11~08.6 ※代引不可 ※北海道・沖縄・離島は送料2160円、PCREでのエスケープが2重でかかってるからなんだろうね。

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

 

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

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

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

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

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

 

こういうことかー!

結論

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

PHP: str_replace – Manual にも

(正規表現のような) 技巧的な置換ルールを必要としない場合 【割引クーポン配布中】ENDLESS/エンドレス MX72 アイシス ANM10W/10G/15W/15G ZGM11W/11G/15W/15G H16.9~ フロント 商品番号:EP404、 preg_replace() の代わりにこの関数を常用するべきです。

って書いてある。

…という訳で HARLEY-DAVIDSON ハーレーダビッドソン 半帽タイプヘルメット PARAMOUNT サンシールドハーフヘルメット【Paramount Sun Shield Half Helmet】 SIZE:XL、

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

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

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

 

 

 

coding , ,