2009-10-07 120 views
0

Ive得到了那些話皺在一起字符串,我需要它們分開,每一個在「A」結束也許應該是在新的一行字,另一個preg_replace問題!

item onea second itema third 

我還需要檢查字以'A'結尾實際上應該以'A'結尾,如額外或蘇丹娜。

item oneasecond itemand an extra item 

我有一個數組完全從本網站http://www.morewords.com/ends-with/a在「A」結尾的單詞,所以我只需要preg_replace函數的功能。

我真的在學習,每次有人在這裏回答了一個問題,所以再次感謝大家的時間和耐心

+0

如果你的例子中帶有「sultana」這個詞,那麼「sultan」怎麼樣?更一般地說,那些既有和沒有尾隨「a」的詞語又如何? – 2009-10-07 11:30:24

+0

所以'項目一蘇丹娜是一個項目'將檢查單詞'sultana'的結束字母,並看到'sultana'在陣列中,而不是recplace,雖然'onea'不會在陣列中,因此它將被替換。這將需要檢查'a' – bluedaniel 2009-10-07 11:38:06

+0

中的每個單詞ENDING因此,你可以保證你不想在「蘇丹」一詞上劃線?因爲如果我們總是忽略「sultana」這個詞,那就錯過了。與「是」和「區域」等一樣。我想我的觀點是,如果你在這件事上有選擇,那麼字母「a」不是一個很好的分隔符。 – 2009-10-07 11:45:54

回答

1

你可以做這樣的事情:

// 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); 

沒有測試過,等等,但它會給你填充了原來分裂的字符串數組$ finalStrings。

更新:修復了代碼中的幾個拼寫錯誤。

+0

這是做的事情,但它沒有把字符串組合在一起,所以嘗試測試'100毫升奶油
100克糖
650克奶油奶酪熱檸檬水香草提取物'顯然它應該回聲兩個'
'標籤奶酪
一個和檸檬
a – bluedaniel 2009-10-07 12:30:56

+0

好的,實際測試了代碼並修復了一些錯別字。至少應該在測試字符串上正常工作。如果你想用
來回顯它,你可以做回聲連接(「
」,$ finalStrings); – 2009-10-07 12:54:30

+0

如此接近!我改變了'$ newString ='a';'這樣a就出現在字符串中,唯一的一點是它在檸檬的一片檸檬中找到了一個,顯然如果它本身就是它的一部分的$ endsWithA,但我嘗試只是把一個空間,它不起作用。想法? – bluedaniel 2009-10-07 13:07:06

0

考慮到它可能是有用的explode()字符串以將其分隔成單詞的數組:

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

如果它們被空格分隔。

然後你可以遍歷數組$words和檢查每一個最終的「A」,如果有必要rtrimming它。

preg_replace()並不總是要回答你的文本操作的需求。

編輯:如果你使用preg_replace$words每個元素然後

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

注意,我沒有嘗試過這一點,我現在不記得這實際上改變數組,但我認爲正則表達式應該是正確的。重要概念是a $,即單字串的結尾的字母a。我認爲這是正確的語法替換一個字母(\w),然後在字符串末尾加一個'a',只有字母,但這裏很晚,我的大腦可能不工作

另外,我們還沒有考慮到你的列表中的約2900字的「A」結束(其中一些我從來沒有聽說過

+0

您的代碼不會更改數組。然而,一個小的改變將會:foreach($ words爲$ key => $ word){$ key => $ word'[$ key] = preg_replace('/ a $ /','',$ word); } – Duroth 2009-10-07 12:32:23

+0

謝謝杜洛斯。正如我在上次編輯中所說的那樣,它遲到了,我的大腦可能無法以最高效率工作。 – pavium 2009-10-07 13:14:23

0

這聽起來更像工作preg_match

0

不確定''是什麼意思,以'A'結尾的每個單詞可能應該在新行'。如果您發佈除輸入字符串以外的實際輸出,總是有幫助的。

你的意思是說一個字與「A」應遵循新的(1)行結束?或者以'a'結尾的單詞在它之前應該有一個新的行?或者可能是兩者的結合,以「a」結尾的單詞放在他們自己的行上(在單詞前後放置一個換行符)?

$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