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

Posted on

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

マットカーボン 7.0Jx17ヨコハマ 17インチカローラ 215/45R17 エコス エモーション T7R ES31 T7R ルミオン全グレードWORK エコス

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

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

 

これだとエラーになってしまい 【USA在庫あり】 マック MAC Performance フルエキゾースト 4-INTO-1 77年-85年 KZ750、KZ650 黒 206250 HD、

17インチカローラ ルミオン全グレードWORK エモーション T7R マットカーボン 7.0Jx17ヨコハマ エコス ES31 215/45R17がご覧になれます

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

正解

そして、

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

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

 

 

何故?

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

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

や 、

php側でのエスケープと 15インチ サマータイヤ セット【適応車種:デイズルークス(B21A系)】WEDS レオニス SK パールブラックミラーカット 4.5Jx15ヨコハマ エコス ES31 165/55R15 ■SMC フローセンサPFMV〔品番:PFMV505-1〕[TR-1635194]、PCREでのエスケープが2重でかかってるからなんだろうね。

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

 

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

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

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

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

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

 

こういうことかー!

結論

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

PHP: str_replace – Manual にも

(正規表現のような) 技巧的な置換ルールを必要としない場合 【送料無料】 サマータイヤ ホイール4本セット クリフクライムTC-01 19インチ 8.0J INSET35 5穴 114.3 ブラックポリッシュ/ブルーライン WINRUN ウィンラン R330 225/45R19 アルファード/エリシオン/アテンザワゴン...etc、 preg_replace() の代わりにこの関数を常用するべきです。

って書いてある。

…という訳で 【送料無料】 215/70R16 16インチ BIGWAY ビッグウエイ TRG バーン XP 6.5J 6.50-16 DUNLOP ダンロップ グラントレック PT3 サマータイヤ ホイール4本セット、

17インチカローラ ルミオン全グレードWORK エモーション T7R マットカーボン 7.0Jx17ヨコハマ エコス ES31 215/45R17

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

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

 

 

 

coding , ,