2011-11-21 125 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); 
}