Başka preg_replace bir soru!

4 Cevap php

Ive, kelime birlikte demetler halinde ve ben onları ayırmak gerekiyor, ve 'A' ile biten her sözcük muhtemelen yeni bir hat üzerinde olmalı olduğu bir dize var

item onea second itema third

Ben de 'A' ile biten kelime aslında ekstra veya sultana gibi 'A' bitmeli olmadığını kontrol etmeniz gerekir.

item oneasecond itemand an extra item

Ben bu web sitesinden 'A' ile biten kelimelerin tam bir dizi var http://www.morewords.com/ends-with/a bu yüzden sadece preg_replace fonksiyonu gerekir.

Gerçekten birisi bu yüzden burada tekrar herkesin zaman ve sabır için teşekkür bir soruyu cevaplar her öğreniyorum

4 Cevap

Böyle bir şey yapabilirsiniz:

// assoc array keyed on words that end with A
$endsWithA = array("sultana" => 1, ...); 

$words = split(' ', $string);

$newString = '';
$finalStrings = array();

foreach ($words AS $w) {    
    // if it ends with a, check to see if it's a real word.
    // if so, end the current string and store it
    if (preg_match("/a$/", $w) && !$endsWithA[$w]) {
        $w = preg_replace("/a$/","", $w);
        $newString .= $w;
        $finalStrings[] = $newString;
        $newString = '';
    }
    else {
        $newString .= $w . ' ';
    }    
}

// Get any remaining newString
if ($newString) $finalStrings[] = trim($newString);

print_r($finalStrings);

Bunu, vb test değil, ama size orijinal bölünmüş dizeleri ile doldurulan bir dizi $ finalStrings verecekti.

Güncelle: kod yazım hataları bir çift sabit.

Bu, daha fazla * preg_match * için bir iş gibi geliyor.

Sen değil 'and every word that ends in 'A' should probably be on a new line' ile ne demek emin. Her zaman yararlı Eğer giriş-string yanında gerçek çıkışını sonrası eğer.

Yani bu bir 'a' yeni bir hat (1) tarafından takip edilmelidir ile biten bir kelime? Veya 'a' ile biten bir kelime ondan önce yeni bir çizgi olması gerektiğini? Ya da belki de ile biten bir kelime yapma ikisinin bir kombinasyonu ', bir' kendi hattı (kelimenin önce ve sonra yerleştirilen bir satır sonu) yerleştirilebilir?

$words = "item onea second itema third";
print_r(preg_split("/\s+(?=\S+a)/i", $words));           // 1
print_r(preg_split("/(?<=a)\s+/i", $words));             // 2
print_r(preg_split("/(?<=a)\s+|\s+(?=\S+a)/i", $words)); // 3

Bu kelimelerin bir diziye ayırmak için explode() dize için yararlı olabileceğini düşünün:

$words = explode(' ', $string);

Onlar boşluklarla ayrılmış iseniz.

Sonra olabilir dizi aracılığıyla döngü $words ve gerekirse rtrimming, son bir 'a' için her biri kontrol.

preg_replace() her zaman metin manipülasyon ihtiyaçlarına cevap olacak değildir.

EDIT: Eğer $words daha sonra her elemanı için preg_replace kullanmak olsaydı

foreach ($words as $word) {
    $word = preg_replace('/(\w)a$/', '\1', $word);
}

Not, ben denemedim, ve bu aslında changes dizisi, ama ben normal ifade hakkında doğru olması gerektiğini düşünüyorsanız ben şu anda hatırlamıyorum. Önemli kavram olan a$, yani end tek kelime dize de bir mektup. I think O (\w) tarafından izlenen bir mektup değiştirilmesi için doğru sözdizimi bir 'a' harfi ile sadece bir dizenin sonunda but it's very late here and my brain may not be working.

Artı, biz dikkate 'a' ile biten yaklaşık 2900 kelime listenizi alarak değil (bazı ben oldum asla bile heard hangisinin)