猿问

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

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)

上面的代码似乎成功地捕获了我需要的部分,但保留了域。我需要删除域并将任何句点转换为空格。


森栏
浏览 152回答 3
3回答

慕容708150

您的正则表达式过于复杂,格式可以简化为:/@([^@\s]+)@[\w.\-]+/.我很确定我知道你接下来的问题是什么......preg_replace_callback().和...$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."并且要记住,电子邮件地址几乎可以是任何东西,这种粗暴的过度简化可能会产生误报/漏报和其他有趣的错误。

RISEBY

如果电子邮件可以包含@并以可选的 开头@,您可以使匹配更加严格,以可选的 @ 开头并添加空格边界(?<!\S)以(?!\S)防止部分匹配。请注意,[^\s@]它本身是一个广泛匹配,可以匹配除 @ 或空白字符之外的任何字符(?<!\S)@?([^\s@]+)@[^\s@]+(?!\S)正则表达式演示例如(使用 php 7.3)$pattern = "~(?<!\S)@?([^\s@]+)@[^\s@]+(?!\S)~";$strings = [&nbsp; &nbsp; "firstname.lastname@domain.co.uk",&nbsp; &nbsp; "firstname.middlename.lastname@domain.co.uk",&nbsp; &nbsp; "The cat sat on the mat whilst @firstname.lastname@domain.co.uk watched in silence."];foreach ($strings as $str) {&nbsp; &nbsp; echo preg_replace_callback(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $pattern,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function($x) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return implode(' ', array_map('ucfirst', explode('.', $x[1])));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $str,&nbsp; &nbsp; ) . PHP_EOL;}输出Firstname LastnameFirstname Middlename LastnameThe cat sat on the mat whilst Firstname Lastname watched in silence.

不负相思意

我刚刚测试过这个,它应该可以工作$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){&nbsp; &nbsp; $matches[1] = ucwords($matches[1], '.');&nbsp; &nbsp; $matches[1]= str_replace('.',' ', $matches[1]);&nbsp; &nbsp; return $matches[1].' ';}, $text);// OUTPUT: The cat sat on the mat whilst Firstname Middlename Lastname watched in silence Firstname Lastname
随时随地看视频慕课网APP
我要回答