Php regex kullanarak boşluk Değiştirme

2 Cevap php

I'm pretty new to regular expressions. I have a requirement to replace spaces in a piece of multi-line text. The replacement rules are these:

  • Start-of-line olmayan bir kırma alan tüm alanlarda değiştirin ( )
  • Bölünemez-boşlukların aynı sayıda tekrarlanır alanlarda herhangi bir örneğini (birlikte birden fazla boşluk) değiştirin
  • Start-of-line olarak değil tek alanlarda bakir kalır

Ben eşleşen deseni oluşturmak için Regex Coach kullandı:

/( ){2,}|^( )/

Diyelim ki bu giriş metin var varsayalım:

asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345

Bir php regex kullanarak işlevini yerine (gibi preg_replace() ) Ben bu çıktıyı almak istiyorum:

asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345

Ben düzenli ifadeler kullanarak basit metin değiştirmelerin yaparken mutlu değilim, ama ben arzu çıktı almak için maç içinde birden kez yerine nasıl çalışıyor sorun yaşıyorum.

2 Cevap

Ben her alanı bulmak ve değiştirmek için daha kolay olacağını tahmin ediyorum. Bunu yapmak için, "bak-ahead" ve "göz-arkasında" grupları kullanabilirsiniz.

Yoksa, (\x20) o kurşun veya (\s) herhangi bir tek boşlukla ardından da bir yer bulmak; ancak, sadece uzay değiştirin.

$str = "asdasd asdasd  asdas1\n asda234 4545    54\n  34545 345  34534\n34 345\n";

print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", "&#160;", $str);

(Markdown nbsp ayrıştırır beri # 160 için seçti.)

Sonuçlar:

asdasd asdasd&#160;&#160;asdas1
&#160;asda234 4545&#160;&#160;&#160;&#160;54
&#160;&#160;34545 345&#160;&#160;34534
34 345

Daha fazla bilgi için, PCRE ve perlre check out.


reply to comments

@ Sprogz : At first, I thought the same. But the example shows a "\n " => "\n&nbsp;" 1. ve 2. hatları arasında.

Böyle değiştirilmesini execute, bazı kod, PHP'nin /e değiştirici kullanabilirsiniz:

$str = preg_replace('/( {2,}|^ )/em', 'str_repeat("&nbsp;", strlen("\1"))', $str);

I've changed the regular expression to capture the spaces. The /m modifer puts it into multi-line mode, so ^ matches the start of any line.