我是一个正则表达式的新手,所以希望有些专家可以用简单的答案对我的问题打个哈欠。我试图找到并替换以某个字母开头的单词,如果它们是复数,则保留它们的复数形式。正则表达式搜索并用可选复数替换
因此,举例来说,我想以取代“带”取代“小男孩”和“男孩”与“带”
text.replace(/\b(b)[\w]+(s?)\b/gi, "<span style=\"font-weight:bold\">$1and$2<\/span>");
然而,$ 2没有未来与选购“S”。
提前致谢!
我是一个正则表达式的新手,所以希望有些专家可以用简单的答案对我的问题打个哈欠。我试图找到并替换以某个字母开头的单词,如果它们是复数,则保留它们的复数形式。正则表达式搜索并用可选复数替换
因此,举例来说,我想以取代“带”取代“小男孩”和“男孩”与“带”
text.replace(/\b(b)[\w]+(s?)\b/gi, "<span style=\"font-weight:bold\">$1and$2<\/span>");
然而,$ 2没有未来与选购“S”。
提前致谢!
只需将[\w]+
更改为[\w]+?
即可。
这改变
从“贪婪”(匹配尽可能多的字符可能也是唯一多达如果被迫放弃字符)
这意味着s?
不匹配,因为[\w]+
已经做到了我们。 (错误的行为)
为“懒惰”(匹配尽可能少的字符越好,只有在绝对必要时增加了比赛)
这给s?
机会来匹配。 (正确的行为)
顺便说一句:您可以将[\w]+?
更改为\w+?
,它将工作完全相同。
[\w]+
已经匹配了“s”。解决办法是让[\w]+
与尽可能少的匹配,而不是尽可能多的“?”修改。因此:
\b(b)[\w]+?(s?)\b
只需使用图案像/\b(([A-Za-z]{3,})+(s))\b/
$text="boys";
echo preg_replace('/\b(([A-Za-z]{3,})+(s))\b/','$2',$text); //output "boy"
从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);
}
完美!我认为\ w正在抓住它,但我不知道这个选项!谢谢! – normmcgarry
这个解决方案对于某些复数有一些缺点。 _kiss_到_kisses_,_lady_到_ladies_是两个例子。不太明显的例子也是_leaf_,_life_到_lives_。您可以用一个或一个条件扩展上面的正则表达式,例如'^ \ b [\ w] +(s | i?es | ves)\ b $''在'kiss'上有点小,但其他大多数情况下它看起来相当匹配。 – mrswadge