使用正则表达式获取复数形式的类名

时间:2011-04-06 23:20:32

标签: php regex

前一段时间,I asked for a function to convert a Spanish class names into plural forms

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

例如,代表发票项目行的类(西班牙语:líneadedetalle de la属factura )可以被称为LineaDetalleFactura,其复数将是{{1} }。

现在,我想修改这个函数,考虑到通过添加“es”而不是“s”形成以辅音结尾的复数单词。

例如,代表付款单的类(西班牙语: orden de pago )可以称为LineasDetalleFactura,其复数应为OrdenPago

关于如何使用正则表达式执行此操作的任何想法?

2 个答案:

答案 0 :(得分:1)

这个问题不容易解决。使用正则表达式,您可以解决80-85%的案例。

换句话说,复数形式不会改变;复数危机也是危机。此外,以é结尾的单词也有例外情况; café的复数是cafés

你也有自己的规则,如mamápapá(复数形式是mamáspapás分别)。

最后,您需要正确调整重音的单词。例如, examen 的复数是exámenes(重音在 a 上)。

我在西班牙语here中找到了一个很好的多元化规则摘要,它可以帮助你。

最好的办法是建立例外及其复数形式的地图。然后,检查该列表中是否存在您正在复数的单词。如果是这样,你可以简单地从地图中获取它的复数。如果地图中不存在该单词,那么您可以应用复数规则来计算复数(我之前链接的页面应该帮助您)。困难的部分是建立例外清单;如果你可以缩小你的清单(即,排除不太可能使用的单词),那么你的工作将会更容易。

答案 1 :(得分:0)

使用此功能:

function pluralize($element) {
    return preg_replace_callback('/^([A-Z][a-z]*)([A-Z]|$)/', function($args) {
        // If the first word ends in consonant, append "e" first. After that, append "s".
        return preg_replace('/([B-DF-HJ-NP-TV-Z])$/i', '\1e', $args[1]) . "s{$args[2]}";
    }, $element);
}