PHP regexp desen ihtiyaç duyulan ekstra eğik çizgi

4 Cevap php

Için bir cevap sınarken another user's question Ben anlamıyveyaum bir şey bulunamadı. Sveyaun bir tek boşluk olan bir dize gelen tüm edebi \t \n \r karakterleri değiştirmek oldu.

Şimdi, ben denedim ilk model oldu:

/(?:\\[trn])+/

hangi şaşırtıcı işe yaramadı. Perl'de aynı model denedim ve gayet iyi çalıştı. Bazı deneme ve yanılma sonra ben PHP gibi maç için bu model için 3 veya 4 ters bölü, istediğini bulundu:

/(?:\\\\[trn])+/

veya

/(?:\\\[trn])+/

these patterns - to my surprise - both wveyak. Why are these extra backslashes necessary?

4 Cevap

Siz regex 1 göstermek için 4 ters eğik gerekiyor çünkü:

  • 2 ters eğik bir dize atlanmaması için kullanılan ("\\\\" -> \\)
  • 1 ters eğik çizgi regex motoru atlanmaması için kullanılmaktadır (\\ -> \)

PHP doc,

başka bir karakter kaçan 1 de yazdırılan ters eğik çizgi neden olur

Bu nedenle için \\\[,

  • \[ geçersiz olduğu için 1 eğik çizgi \, bir kalmak atlanmaması için kullanılır ("\\\[" -> \\[)
  • 1 ters eğik çizgi regex motoru atlanmaması için kullanılmaktadır (\\[ -> \[)

Evet ama iyi bir uygulama çalışır.

Perl'de Onun eserleri geçmek çünkü doğrudan regex desen /(?:\\[trn])+/ olarak

ancak php, sen dize olarak geçmesine gerek, bu yüzden ters eğik çizgi kendisi için kaçan ekstra gerekir.

"/(?:\\\\[trn])+/"

The regex \ to match a single backslash would become '/\\\\/' as a PHP preg string

Düzenli ifade is sadece /(?:\\[trn])+/. Siz de dize bildirilerde ters eğik çizgi kaçış gerekir çünkü Ama, her ters eğik çizgi ile ifade edilmelidir \\:

"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'

PHP kaçış dizisi \[ bilmek ve bunu yok sayıyor, çünkü sadece üç backspaces da çalışır. Yani \\ \ olacak ama \[ \[ kalacak.

Str_replace kullanın!

$code = str_replace(array("\t","\n","\r"),'',$code);

Hile yapmak gerekir