Php 如何检查一个人全名的不同拼写

Php 如何检查一个人全名的不同拼写,php,regex,search,Php,Regex,Search,我试图创建一个正则表达式,在一个巨大的文档中搜索一个人的全名。在文本中,姓名可以是完整的,或者名字可以缩写为一个字母,或者是一个字母后跟一个点或省略。例如,我现在对阿尔贝托·豪尔赫·阿隆索·卡勒法奇奥的搜索是: preg_match('/([;:.,&\s\xc2\-(){}!"'<>]{1})(ALBERTO|A.|A)[\s\xc2-]+ (JORGE|J.|J)?[\s\xc2,]+(ALONSO)[\s\xc2*-]+(CALEFACCION))([;:.,&

我试图创建一个正则表达式,在一个巨大的文档中搜索一个人的全名。在文本中,姓名可以是完整的,或者名字可以缩写为一个字母,或者是一个字母后跟一个点或省略。例如,我现在对阿尔贝托·豪尔赫·阿隆索·卡勒法奇奥的搜索是:

preg_match('/([;:.,&\s\xc2\-(){}!"'<>]{1})(ALBERTO|A.|A)[\s\xc2-]+
(JORGE|J.|J)?[\s\xc2,]+(ALONSO)[\s\xc2*-]+(CALEFACCION))([;:.,&\s\xc2(){}
!"'<>]{1})/i', $text, $match);
preg|u match('/([;:,&\s\xc2\-(){}!']{1})(阿尔伯托A.[s\xc2-]+
(JORGE | J.| J)?[\s\xc2,]+(ALONSO)[\s\xc2*-]+(Calefacion))([;:,&\s\xc2(){}
!“']{1})/i',$text,$match);
在名字和姓氏之间可以有一个星号(*)


这是工作的情况下,所有的名字至少是目前的一些方式。但是我不知道当名字被省略时,如何扩展这个表达式。你能帮我吗?

让我们从简化你所拥有的东西开始

开始:

/([;:.,&\s\xc2\-(){}!"'<>]{1})(ALBERTO|A.|A)[\s\xc2-]+(JORGE|J.|J)?[\s\xc2,]+(ALONSO)[\s\xc2*-]+(CALEFACCION)([;:.,&\s\xc2(){}!"'<>]{1})/i
(额外的好处是:现在两边的字符都不匹配,而且在文本的开头和结尾都匹配)

接下来,您可以使用点的
标记(顺便说一下,应该转义;
是特殊的,表示“匹配任何内容”)

最后,要真正回答你的问题,你有两个选择。将整个括号内的名称设置为可选,或添加一个新的空白选项。第一个是最灵活的,因为我们也需要处理空白:

/\b((ALBERTO|A\.?)[\s\xc2-]+((JORGE|J\.?)[\s\xc2,]+)?)?(ALONSO)[\s\xc2*-]+(CALEFACCION)\b/i
请注意,如果您正在读取匹配的部分,则需要更新索引。还请注意,这修复了省略第二个名称(JORGE)仍然需要额外空间的问题

这将匹配像
A.J.ALONSO calefacion
A.ALONSO calefacion
ALONSO calefacion
,但不是
J.ALONSO calefacion
(如果您愿意,这只是一个小小的调整)

为了清晰起见,将最后一个字符串拆分:

/\b
(
    (ALBERTO|A\.?)[\s\xc2-]+
    (
        (JORGE|J\.?)[\s\xc2,]+
    )?
)?
(ALONSO)[\s\xc2*-]+
(CALEFACCION)
\b/i

最后,这是一个奇怪的想法,但您可以将可以是首字母的名称更改为以下形式:
(A(LBERTO)
,这意味着您没有重复首字母(潜在的错误来源)

让我们从简化现有内容开始

开始:

/([;:.,&\s\xc2\-(){}!"'<>]{1})(ALBERTO|A.|A)[\s\xc2-]+(JORGE|J.|J)?[\s\xc2,]+(ALONSO)[\s\xc2*-]+(CALEFACCION)([;:.,&\s\xc2(){}!"'<>]{1})/i
(额外的好处是:现在两边的字符都不匹配,而且在文本的开头和结尾都匹配)

接下来,您可以使用点的
标记(顺便说一下,应该转义;
是特殊的,表示“匹配任何内容”)

最后,要真正回答你的问题,你有两个选择。将整个括号内的名称设置为可选,或添加一个新的空白选项。第一个是最灵活的,因为我们也需要处理空白:

/\b((ALBERTO|A\.?)[\s\xc2-]+((JORGE|J\.?)[\s\xc2,]+)?)?(ALONSO)[\s\xc2*-]+(CALEFACCION)\b/i
请注意,如果您正在读取匹配的部分,则需要更新索引。还请注意,这修复了省略第二个名称(JORGE)仍然需要额外空间的问题

这将匹配像
A.J.ALONSO calefacion
A.ALONSO calefacion
ALONSO calefacion
,但不是
J.ALONSO calefacion
(如果您愿意,这只是一个小小的调整)

为了清晰起见,将最后一个字符串拆分:

/\b
(
    (ALBERTO|A\.?)[\s\xc2-]+
    (
        (JORGE|J\.?)[\s\xc2,]+
    )?
)?
(ALONSO)[\s\xc2*-]+
(CALEFACCION)
\b/i

最后,这是一个奇怪的想法,但您可以将可以是首字母的名称更改为以下形式:
(A(LBERTO)
,这意味着您没有重复首字母(潜在的错误来源)

只是稍微相关,但
\b
是“断字”。您可以显著简化表达式的开头。仅稍微相关,但
\b
是“分词”。您可以显著简化表达式的开头。你好,Dave,非常感谢。我花了很多时间在正则表达式上。我已经学了不少,但我知道的还是计算机语言。你好,戴夫,非常感谢。我花了很多时间在正则表达式上。我已经学了不少,但仍然是我所知最少的计算机语言。