2011-03-14 49 views
0

我從單數形式,其轉換類名稱的功能複數形式(在西班牙!):這個函數的逆可以用正則表達式來計算嗎?

function pluralize($element) { 
    return preg_replace('/^([A-Za-z][a-z]*)([A-Z]|$)/', '\1s\2', $element); 
} 

現在我想定義這個函數的反函數。以下功能是否有效?

function singularize($plural) { 
    return preg_replace('/^([A-Za-z][a-z]*)(s)([A-Z]|$)/', '\1\3', $element); 
} 

回答

1

它應該工作正常,但你並不需要周圍的S括號中的第二圖案。您還需要記住,如果您有多個s,那麼這兩種模式都不會在意這一點。因此,第一種模式將ClassX更改爲ClasssX,第二種模式將將其更改回ClassX。只是要記住。

+0

我很擔心,因爲測試字母's'是否應該被視爲模式'[a-z]'或模式's'的非確定性使得我的「正則表達式」在技術上不是一個正則表達式。 – pyon 2011-03-14 16:39:42

1

通常,只有's'被排除在[a-z] *位置
創建類名稱時。

這將意味着[a-z] *需要排除's'。像[a-rt-z]*
然後這些可能工作。

/^([A-Za-z][a-rt-z]*) ([A-Z]|$)/x
/^([A-Za-z][a-rt-z]*)(s)([A-Z]|$)/x

編輯 - 否則(你有什麼),你就必須跟蹤每個類名處於什麼狀態,即:如果它沒有被使用複數,它不能單數化,否則額外的's'可能會從原始類名稱中刪除。

正則表達式的上面不需要維護狀態,但它們在形式上有限。
爲了區分單數/複數狀態,最好在類中添加一個區分字符。如果支持,也許是下劃線。否則將沒有控制或其他可識別的標記來確定哪個是哪個標記。

相關問題