为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式将电子邮件转换为名称

正则表达式将电子邮件转换为名称

PHP
森栏 2023-05-26 16:10:41
preg_replace在将电子邮件地址转换为在长文本块中使用的名称时,我需要一些帮助。我的电子邮件可以遵循两种不同的结构:1) firstname.lastname@domain.co.uk或者2) firstname.middlename.lastname@domain.co.uk为了可能使这更复杂,在文本电子邮件地址中以 @ 开头,例如:猫坐在垫子上,@firstname.lastname@domain.co.uk 静静地看着。应该:猫坐在垫子上,名字姓氏静静地看着。preg_replace("/\B@(\w*[a-z_.]+\w*)/i", "$1", $text)上面的代码似乎成功地捕获了我需要的部分,但保留了域。我需要删除域并将任何句点转换为空格。
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

  1. 您的正则表达式过于复杂,格式可以简化为:/@([^@\s]+)@[\w.\-]+/.

  2. 我很确定我知道你接下来的问题是什么......

  3. preg_replace_callback().

  4. 和...

$in = 'The cat sat on the mat whilst @first.middle.last@domain.co.uk watched in silence.';


var_dump(

    preg_replace_callback(

        '/@([^@\s]+)@[\w.\-]+/',

        function($in) {

            $parts = explode('.', $in[1]);

            $parts = array_map('ucfirst', $parts);

            $name = implode(' ', $parts);

            $email = substr($in[0], 1);

            return sprintf('<a href="mailto:%s>%s</a>', $email, $name);

        },

        $in

    )

);

输出:


string(118) "The cat sat on the mat whilst <a href="mailto:first.middle.last@domain.co.uk>First Middle Last</a> watched in silence."

并且要记住,电子邮件地址几乎可以是任何东西,这种粗暴的过度简化可能会产生误报/漏报和其他有趣的错误。


查看完整回答
反对 回复 2023-05-26
?
RISEBY

TA贡献1856条经验 获得超5个赞

如果电子邮件可以包含@并以可选的 开头@,您可以使匹配更加严格,以可选的 @ 开头并添加空格边界(?<!\S)(?!\S)防止部分匹配。

请注意,[^\s@]它本身是一个广泛匹配,可以匹配除 @ 或空白字符之外的任何字符

(?<!\S)@?([^\s@]+)@[^\s@]+(?!\S)

正则表达式演示

例如(使用 php 7.3)

$pattern = "~(?<!\S)@?([^\s@]+)@[^\s@]+(?!\S)~";

$strings = [

    "firstname.lastname@domain.co.uk",

    "firstname.middlename.lastname@domain.co.uk",

    "The cat sat on the mat whilst @firstname.lastname@domain.co.uk watched in silence."

];

foreach ($strings as $str) {

    echo preg_replace_callback(

            $pattern,

            function($x) {

                return implode(' ', array_map('ucfirst', explode('.', $x[1])));

            },

            $str,

    ) . PHP_EOL;

}

输出


Firstname Lastname

Firstname Middlename Lastname

The cat sat on the mat whilst Firstname Lastname watched in silence.


查看完整回答
反对 回复 2023-05-26
?
不负相思意

TA贡献1777条经验 获得超10个赞

我刚刚测试过这个,它应该可以工作



$text="The cat sat on the mat whilst @firstname.middlename.lastname@domain.co.uk watched in silence @firstname.lastname@domain.co.uk.";



echo preg_replace_callback("/\B\@([a-zA-Z]*\.[a-zA-Z]*\.?[a-zA-Z]*)\@[a-zA-Z.]*./i", function($matches){

    $matches[1] = ucwords($matches[1], '.');

    $matches[1]= str_replace('.',' ', $matches[1]);

    return $matches[1].' ';

}, $text);


// OUTPUT: The cat sat on the mat whilst Firstname Middlename Lastname watched in silence Firstname Lastname


查看完整回答
反对 回复 2023-05-26
  • 3 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信