Noktalama URL'leri hariç üzerinde bölmek için Regex

3 Cevap php

Ben onun noktalama üzerinde bir dize bölmek için çalışıyorum, ama dize (uygun tüm tipik noktalama işaretleri var) URL'ler içerebilir.

Ben RegEx'in temel çalışma bilgi var, ama burada bana yardımcı olmak için yeterli değildir. Bu benim sorun keşfetti zaman ben kullanıyordum budur:

$text[$i] = preg_split('/[\.\?!\-]+/', $post->text);

(- Elips, vb bu aynı zamanda birden fazla ardışık noktalama karakterleri için hesapları!!???!?)

URL'lerin bütünlüğünü koruyarak nasıl noktalama üzerinde bir dize bölmek istiyorsunuz? Teşekkürler!

Edit:

Özür dilerim ... Bir örnek bir tweet çizgisinde bir şey olacaktır:

"Blah blah blah? A sentence. Here's a link: http://somelink.com?key=value ."

Sonuçlar bu gibi görünmelidir:

[0] => "Blah blah blah?"
[1] => "A sentence."
[2] => "Here's a link: http://somelink.com?key=value ."

3 Cevap

Eğer bölünmüş öğelerden biri noktalama tutmaya çalışıyoruz çünkü burada ne yapıyoruz, noktalama quite bölme değildir. Ayrıca sonradan boşluk atmak için çalışıyorsanız, ancak söz konusu olduğunu örtülü olması görünmüyor.

Ben aşağıdaki şekilde bu mücadele olacaktır: noktalama or bir URL ile eşleşen bir düzenli ifade ile giriş dize bölmek ve ayırıcılar dahil parçaları tutmak. Sonra öğeler üzerinde yineleme ve her ayırıcı için bu durumda sondaki boşluk şerit ve önceki öğenin sonuna taşımak veya bir URL, bu durumda sadece önceki ile katılmak ve noktalama olduğunu karar Aşağıdaki öğeler.

PHP, böyle bir şey kullanarak sınırlayıcılarınıda tutabilirsiniz:

$text[$i] = preg_split('/([\.\?!\-]+|https?:\/\/\S+)/', $post->text, PREG_SPLIT_DELIM_CAPTURE);

: PREG_SPLIT_DELIM_CAPTURE flag in the documentation olarak açıklanmıştır burada

If this flag is set, parenthesized expression in the delimiter pattern will be captured and returned as well.

Lütfen URL olmayan noktalama işaretleri takip bir model var mı? Çoğu İngilizce cümleler, birçok noktalama işaretleri takip (ya da bazen preceeded) bir boşluk karakteri vardır. Bir URL noktalama işaretleri her iki tarafta boşluk var değil çünkü, ben senin kaynak metin gibi ne olduğunu bilmiyorum ama bunu yapmak için güvenilir bir yol olabilir - bir boşluk ve ardından bir noktalama işareti ile END olabilir ancak - Ben de size tahmin URL'leri bağlıdır sanırım.

Başka approace (Eğer aşamalarında bu yapıyor sakıncası yoksa) dize URL'leri kaldırmak ve daha sonra bu sonucu üzerinde işleme kalanını yapmaktır. Eğer URL'leri ihtiyacınız yoksa sadece çalışır. Eğer URL'leri korumak için gerekiyorsa, gibi URL iki tarafında yer tutucu dizeleri ekleyebilirsiniz ">>>> http://placeholder.com <<<<" Eğer noktalama bölünmüş zaman ve daha sonra, >>>> ve <<<< arasında oluşur herhangi NOKTALAMA dışlamak emin olun. Daha sonra, >>>> kaldırmak için olurdu ve <<<<

Bu regex Verdiğin örneği üretir:

/(?<!http[^\s]{0,2048})[\.\?\!\-]+\B/

Bu noktalama kümesi not 'http' ile başlayan ve bir boşluk karakteri ile biten bir dize öncesinde arar. Sondaki \ B bölünmeye neden olan tireli bir sözcüğü önler

but...

Bu giriş:

Blah blah blah? A sentence. Here's a link: http://somelink.com?key=value.blah blah blah...

ikiye value.blah bölünmüş ... ama could geçerli bir URL parçası olmak URL eşleştirme regex 'value.blah' olarak aynı sorun olurdu düşünmek olmaz. Ben veri, twitter kullanıcılarından gelen, sen FrustratedWithFormsDes 'ikinci Öneriniz için gitmek bile, çok tutarsız ve temizlemek için bu nedenle zor olacağını düşünüyorum.