PHP:正则表达式将电话号码转换为文本中的html A标记

iih3973s  于 2023-04-28  发布在  PHP
关注(0)|答案(1)|浏览(106)

我想转换以下文本中的所有电话号码到HTML A标签:

My phone number is 06 06 06 06 06.

But this one can write +33 606 06 06 06.

My facebook profile is https://www.facebook.com/profile.php?id=100060606060606.

该功能应按以下方式呈现文本:

My phone number is <a href="tel:06 06 06 06 06">06 06 06 06 06</a>.

But this one can write <a href="tel:+33 606 06 06 06">+33 606 06 06 06</a>.

My facebook profile is https://www.facebook.com/profile.php?id=100060606060606.

我尝试将preg_replace与REGEX #(?:(?:\+|00)33|0)\s*[1-9](?:[\s.-]*\d{2}){4}#一起使用
然而,这个正则表达式也捕获了facebook链接中的数字。
如何构造正则表达式以避免在Facebook链接中捕获数字,或者用PHP执行任务的另一种解决方案?

gk7wooem

gk7wooem1#

您可以在相关位置添加数字边界:

(?:(?:\+|(?<!\d)00)33|(?<!\d)0)\s*[1-9](?:[\s.-]*\d{2}){4}(?!\d)
//       ^^^^^^^      ^^^^^^^                             ^^^^^^

这里,(?<!\d)是左手数字边界,(?!\d)是右手数字边界。参见regex demo
请注意,\+部分之前没有数字边界模式,因为+已经是一个非数字字符。
另一个具有类似逻辑的模式可以用单词和非单词边界来写:

(?:(?:\B\+|\b00)33|\b0)\s*[1-9](?:[\s.-]*\d{2}){4}\b
//    ^^   ^^      ^^                             ^^

这里,\B放在\+之前,以匹配字符串的开头,或者当它紧挨着任何其他非单词字符时。参见regex demo。请注意,它比第一个正则表达式的限制性更强。

相关问题