2013-11-01 16 views
0

我在Regular Expressions上有點生疏,所以很感謝幫助。對於當前的項目,我需要對一些用戶輸入進行消毒,並將縮略的英國郡名轉換爲冗長的對應名稱(例如Lincs => Lincolnshire)。PHP RegularExpression用字符串開頭替換單詞,後面跟着空格

我寫了一個函數來處理這裏面使用正則表達式,因爲我們只希望,更換當縮寫或者在字符串的開頭,或用逗號或空格, preceeded接着是空格(或字符串終止)。

因此,考慮的Lincs的例子中,如下替換應該發生:

Boston, Lincs =>Boston, Lincolnshire(因爲Lincs由空格preceeded)
Lincs =>Lincolnshire(因爲Lincs是在字符串的開始)
Test, Lincsto =>Test, Lincsto因爲Lincs具有其他字符以下)

這裏S中的函數是什麼樣子現在:

function fullCounties() 
{ 
    $replacements = array(
     'lincs' => 'Lincolnshire' 
    ); 

    $new = $_REQUEST['place']; 
    foreach($replacements as $find => $replace) 
    { 
     $new = preg_replace('/(^|\W)'.$find.'([\W\d])/', $replace, $new); 
    } 
    echo $new; 
} 

但這只是返回Boston, Lincs,而不是預期的Boston, Lincolnshire。任何人都可以解釋正確的RegExp以符合上面列出的要求,或者建議爲什麼這個不起作用?

回答

1

那是因爲你正在使用lincs搜索Lincs,沒有的情況下,insensetive標誌,這將失敗。此外,你可能想看看Word邊界(\b)。

$new = preg_replace("(\b".preg_quote($find)."\b)i",$replace,$new); 
+0

謝謝,這似乎是最乾淨的解決方案,並且運作良好。 – BenM

+0

@BenM:它可能適用於你,但'\ b'(單詞邊界)與你在你提出的問題中提出的要求不符。 – anubhava

+0

@anubhava請解釋。 –

1

我們只想在縮寫詞位於字符串開頭,或者前面加逗號或空格,後面跟着空格(或字符串結尾)時進行替換。

使用此代碼環視正則表達式:

$new = preg_replace('/(?<=^|[,\s])'. preg_quote($find) . '(?=\s|$)/', $replace, $new); 
相關問題