Nasıl php sınırlayıcı bitişik çiftleri Perl uyumlu düzenli ifade tabanlı maç?

3 Cevap php

Örneğin ben, hemen yanındaki birbirlerine birden çok sınırlayıcı içerebilir bir dize var | bitişik sınırlayıcı herhangi bir sayı olabilir, olsa | |. Ben belirli bir karakterle komşu çifti "arasında" herhangi bir yerde değiştirmeniz gerekiyor. Bu ayraçlar sadece sınırlayıcı değil, hatta boşluklar arasında bir karakter varsa maç gerekecektir.

Yani değiştirin:

ABC|||Blah     with     ABC|*|*|Blah

However, when I try it, it will not "fill in" the gap between all of them. In the same example above it only results in ABC|*||Blah
Four delimiters result in ABC|*||*|Blah

Nasıl ben ne gerek yapacak regex desen yazabilirim? PHP'nin preg_replace kullanıyorum.

3 Cevap

Kullanarak hem emrini bakmak ve göz arkasında:

(?<=\|)(?=\|)

küresel ile değiştirin

*

Benim için çalıştı cevabı bir pozitif ileri yönlü olduğu ortaya çıktı.

/\|(?=\|)/

Bu ayraçlar kesinlikle bitişik olan tüm yerler eşleşti. Ileri lookahead ikinci sınırlayıcı, bana bahsedilen örnekte onları maç için izin anahtar maç parçası gibi oldu kabul değildi.

Neden birlikte çalışmıyor str_replace:

$str = str_repalce('||', '|*|', str_replace('||', '|*|', $str));


Ben sizin için ne arıyor anlamak biliyorum gibi Edit, boşluklar oluşabilir üç durumlar vardır:

  1. başlangıcında: |foo|bar*|foo|bar
  2. orta: foo||barfoo|*|bar
  3. sonunda: foo|bar|foo|bar|*

Son iki aynı anda ele alınabilir, ancak ilk birbirlerinden ayrı olarak ele alınması gereken var

$str = preg_replace('/^\|/', '*|', preg_replace('/\|(?=\||$)/', '|*', $str))