nasıl bu regex kurallar birleştirmek olabilir?

6 Cevap php

Ben Regexes kullanarak aşağıdaki PHP kodu ile bir Twitter akışında cevaplarda @ tespit ediyorum.

$text = preg_replace('!^@([A-Za-z0-9_]+)!', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);
$text = preg_replace('! @([A-Za-z0-9_]+)!', ' <a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);

Nasıl iyi bir cevapta olarak yanlış işaretleme email@domain.com olmadan bu iki kural birleştirebilirsiniz?

6 Cevap

Tamam, ikinci bir düşünce, bir kelime ile ifade edilebilir başka unsur bir e-posta olarak işaret olabilir çünkü e-posta önceki elemanın bir "non-word" kalemi, olmak zorunda olduğu anlamına gelir ne olursa olsun @ işaretleme değil, bu yol açacak böylece :

!(^|\W)@([A-Za-z0-9_]+)!

ama sonra yerine 1 $ 2 $ kullanmak zorunda.

^ RE başında durmak zorunda olmadığından, sen gruplandırma kullanabilir ve | Bu Res birleştirmek.

Eğer yakalanan boşluk yeniden eklemek istemiyorsanız, siz "Pozitif Geriye İlerleme" kullanmak zorunda:

$text = preg_replace('/(?<=^|\s)@(\w+)/',
    '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);

ya da "negatif Geriye bakan":

$text = preg_replace('/(?<!\S)@(\w+)/',
    '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);

Anlamak için daha kolay bulabilirsiniz ... hangisi.

İşte arada yapmak istiyorum nasıl

$text = preg_replace('!(^| )@([A-Za-z0-9_]+)!', '$1<a href="http://twitter.com/$2" target="_blank">@$2</a>', $text);
preg_replace('%(?<!\S)@([A-Za-z0-9_]+)%', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text);

(?<!\S) gevşek "hayır boşluk olmayan karakter önceki" çevrilir. Ayrıca bir çift-olumsuzlama, ancak tür dize / satır başında çalışıyor.

Bu, herhangi bir önceki karakter tüketmek olmaz herhangi bir yakalama grubunu kullanmaz, ve geçerli bir e-posta adresi gibi "foo-@host.com" gibi dizeleri, maç olmayacak.

Test:

Input = 'foo bar baz-@qux.com bee @def goo@doo @woo'
Output = 'foo bar baz-@qux.com bee <a href="http://twitter.com/def" target="_blank">@def</a> goo@doo <a href="http://twitter.com/woo" target="_blank">@woo</a>'

Hu, çocuklar, çok itmeyin ... İşte burada:

!^\s*@([A-Za-z0-9_]+)!

Ben, sen münavebeye kullanabilirsiniz düşünüyorum: böylece bir dize başında ya da bir yer aramak

'!(?:^|\s)@([A-Za-z0-9_]+)!'