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

Posted on

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

】《09 【特価キャンペーン中】 【フォクトランド】スポーツスプリング(ダウンサス) 【フォクトランド】スポーツスプリング(ダウンサス) 【特価キャンペーン中】 7er ダウン量(mm)[40] (F01) 【740 -》 BMW

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

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

 

これだとエラーになってしまい 1996-2002 4Runner185系ハイラックスサーフフロント2.5インチアップスぺーサー&デフダウンキット、

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

正解

そして、

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

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

 

 

何故?

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

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

や 、

php側でのエスケープと 【送料無料】 245/40R20 20インチ WEDS ウェッズ マーベリック 910M 8.5J 8.50-20 SAFFIRO サフィーロ SF5000(限定) サマータイヤ ホイール4本セット 後部座席 シートカバー トヨタ シエンタ 専用 X-1プレミアムオーダー リア席[1列分]シートカバー カスタマイズ ※オーダー受注生産(約45日)代引き不可、PCREでのエスケープが2重でかかってるからなんだろうね。

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

 

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

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

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

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

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

 

こういうことかー!

結論

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

PHP: str_replace – Manual にも

(正規表現のような) 技巧的な置換ルールを必要としない場合 18インチ サマータイヤ セット【適応車種:クラウンロイヤル(210系 ハイブリッド含む)】WEDS ウェッズスポーツ RN-05M グロスブラック 8.5Jx18エナセーブ RV504 225/45R18、 preg_replace() の代わりにこの関数を常用するべきです。

って書いてある。

…という訳で G&Yu バッテリー HD-D31L PRO HEAVY-Dシリーズ キャップタイプ(長距離トラック・バス・集配車用) ジーアンドユー、

【特価キャンペーン中】 【フォクトランド】スポーツスプリング(ダウンサス) BMW 7er (F01) 【740 】《09 -》 ダウン量(mm)[40]

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

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

 

 

 

coding , ,