2011-11-21 51 views
2

我是一個正則表達式的新手,所以希望有些專家可以用簡單的答案對我的問題打個哈欠。我試圖找到並替換以某個字母開頭的單詞,如果它們是複數,則保留它們的複數形式。正則表達式搜索並用可選複數替換

因此,舉例來說,我想以取代「帶」取代「小男孩」和「男孩」與「帶」

text.replace(/\b(b)[\w]+(s?)\b/gi, "<span style=\"font-weight:bold\">$1and$2<\/span>"); 

然而,$ 2沒有未來與選購「S」。

提前致謝!

回答

8

只需將[\w]+更改爲[\w]+?即可。

這改變

從「貪婪」(匹配儘可能多的字符可能也是唯一多達如果被迫放棄字符)
這意味着s?不匹配,因爲[\w]+已經做到了我們。 (錯誤的行爲)

爲「懶惰」(匹配儘可能少的字符越好,只有在絕對必要時增加了比賽)
這給s?機會來匹配。 (正確的行爲)

順便說一句:您可以將[\w]+?更改爲\w+?,它將工作完全相同。

+0

完美!我認爲\ w正在抓住它,但我不知道這個選項!謝謝! – normmcgarry

+1

這個解決方案對於某些複數有一些缺點。 _kiss_到_kisses_,_lady_到_ladies_是兩個例子。不太明顯的例子也是_leaf_,_life_到_lives_。您可以用一個或一個條件擴展上面的正則表達式,例如'^ \ b [\ w] +(s | i?es | ves)\ b $''在'kiss'上有點小,但其他大多數情況下它看起來相當匹配。 – mrswadge

1

[\w]+已經匹配了「s」。解決辦法是讓[\w]+與儘可能少的匹配,而不是儘可能多的「?」修改。因此:

\b(b)[\w]+?(s?)\b 
0

只需使用圖案像/\b(([A-Za-z]{3,})+(s))\b/

$text="boys"; 
echo preg_replace('/\b(([A-Za-z]{3,})+(s))\b/','$2',$text); //output "boy" 
0

從PHP問題Regex - How to search for singular or plural version of word

繼續如果你知道你的搜索詞是什麼,它可以是非常簡單的。這裏有一個簡單的例子,我在PHP中使用突出顯示搜索詞出現的所有無論是單數,複數簡單(一個或多個),全部小寫或首字母大寫:

function add_highlight($content,$term) 
{ 
    //always remove last s if it exists 
    //and could use similar strategy to test other endings such as -es and -ies 
    //by conditionally building the regex test string based on term's ending 
    $term_no_s = rtrim($term,"s"); 
    return preg_replace("/({$term_no_s}s)|({$term_no_s})/i", "<span class='highlight'>$0</span>", $content); 
}