Nasıl bir regex bir karakteri 'yutmak' değil yapabilirim?

4 Cevap php

Ben şöyle bir metin dosyası var

{word} definition
{another word} another definition {word} they don't have to be on different lines

Ben kullanıyordum regex oldu

    $regex = '/\{([a-z]+?)\}(.+?)\{/i';

Ancak bu, bu sorunlara neden o swallows son ayraç {ve o maç olmayacak bir sonraki kelime {yanında.

Göstermek için, ben hata ayıklama amaçları için yaptım

echo preg_replace($regex, '<b style="background-color: red;">$1</b><b style="background-color: yellow;">$2</b>', $content);

İşte benim çıkışına bir örnek (bu nedenle regex uyumlu değildir, yoktur bir sonraki kelime açılış kuşak fark) olduğunu

<b style="background-color: red;">shrub</b><b style="background-color: yellow;"> Multi stemmed woody plant</b>Abaxial}    side or face away from the axis

Bunu nasıl işe almak için benim regex değiştirebilir miyim? Teşekkür ederim

EDIT

Cevaplar için çok teşekkürler. Ben bu yüzden gibi benim regex değiştirdim

$regex = '/\{([a-z\-\s]+?)\}([^\{]+)/i';

Ben de ileri yönlü makaleleri içine bakacağız.

4 Cevap

Bu özel durumda, sen yapabilirsin:

$regex = '/\{([a-z]+?)\}([^\{]+)/i';

[^\{] "bir sol ayraç olmayan herhangi bir karakterle eşleşir" anlamına gelir. Bu da giriş sonunda bir { gerekmeyen avantajına sahiptir.

Diğerleri de söylediğim gibi daha genel, ayrıca lookahead onaylamaları kullanabilirsiniz.

Bunu yakalayan olmadan, bir karakteri bulmak için Look Ahead özelliğini kullanmak isteyeceksiniz.

Siz de böylece regex yeniden olabilir.

$regex = '/\{([a-z]+?)\}(.+?)(?={)';

Sen .+ bir küme ayracı ardından, gibi pek yerine sadece sigara kaşlı ayraç karakterleri eşleştirmek son bölümünü değiştirebilir:

$regex = '/\{([a-z]+?)\}([^{]+)/i';