RegEx: eşleşen ve "AB ABC D" ABC yerine

3 Cevap php

Ben bu pasajı tavsiye gerekir

$text = preg_replace('|(A.*)?A(.*)C|', '$1foo$2bar', $text);

Bu "AB ABC D" ABC maç ve "AB fooBbar D" ile yerini alacak; Gördüğünüz gibi bu onu kaybetmemek için de, 1 $ ile değiştirme dizesi tekrarlamak zorunda yanı başında "AB" bölümünü eşleşir.

Bu böyle bir sonuç almak için en iyi yolu nedir?

Bir bayrak X öyle ki var mı

$text = preg_replace('|A(.*)C|X', 'foo$1bar', $text);

aynı sonucu üretir?

Ben açık oldum umarım

Teşekkür ederiz!

EDIT: A, B, C keyfi karakter atom dizeleri gibi, onlar da whitespaces içerebilir düşünün

O "ABC ABC" sadece ikinci "ABC" ile eşleşir gibi Ayrıca, sunulan örnek, aslında arabası olduğunu.

EDIT2: Özür dilerim, ben muhtemelen çok kötü sorun açıkladı ettik. Nokta ben maçta hiçbir alt dize bir olduğunu, böylece whatever iki A, C dize arasında maç isterdim olduğunu

Tekrar teşekkürler

3 Cevap

Soru açıklığa kavuşturulmuştur gibi, bu ifadeyi deneyin:

preg_replace('/(?:A)+(.+?)(?:C)+/', 'foo$1bar', $text)

Örnek:

$A = 'abc'; $B = '123'; $C = 'xyz';
$text = "$A$B$C $A$A$B$C $A$B$C$C";
echo preg_replace("/(?:$A)+(.+?)(?:$C)+/", 'foo$1bar', $text);

Buna ne dersiniz:

$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text);

\S olmayan bir boşluk karakteriyle eşleşir, bu nedenle farklı kelimelerin arasında yerini almayacak.


OP'ın bazı yorumlar gördükten sonra, ben başka bir tahmin tehlike olacak:

$text = preg_replace('|A(B)C|', 'foo$1bar', $text);

* Nicelik olmayan açgözlü sürümünü kullanın:

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);