如何在 sting 中找到不需要的 URL

How to find unwanted URL in sting

我想检查垃圾邮件 URL 的文本。例如这里:

$str = 'Curabitur aliquet quam page.com Page.Com t e x t . c o m id dui .Posuere curabitur strona quam id dui posuere. Aitur aliquet TEXT.COM quam id dui posuere. A ';

我要找

$num_found = preg_match_all($pattern, ($str), $out)

但我只找到这个:

我的正则表达式看起来像这样

$pattern = '|[A-Za-z0-9]+\s*\.{1}\s*([a-z0-9]+)(\s*\.{1}([a-z0-9]+))*|';

所以我基本上是先查找单词,然后再查找一个点前后的空格。 它有效,但问题是它不适用于以大写字母 lock 开头或全部为大写字母的单词。当我将 [A-Za-z0-9] 添加到正则表达式的所有单词时,它也会匹配句子末尾的单词,所以这是一个错误的解决方案。

我正在考虑做另一个正则表达式来检查大写。但我不确定什么是最好的解决方案。提前致谢

一个选项是使用交替 | 来匹配第一部分中以点分隔的多个字符,或匹配第二部分中以 space 或点分隔的单个字符。

(?<!\S)(?:[A-Za-z0-9]+\.[A-Za-z0-9]+|[A-Za-z0-9](?:\h+[A-Za-z0-9])*\h+\.\h+[A-Za-z0-9](?:\h+[A-Za-z0-9])*)(?!\S)

Regex demo

如果要多次匹配一个点:

(?<!\S)(?:[A-Za-z0-9]+(?:\.[A-Za-z0-9]+)+|[A-Za-z0-9](?:\h+[A-Za-z0-9])*(?:\h+\.\h+[A-Za-z0-9](?:\h+[A-Za-z0-9])*)+)(?!\S)

Regex demo

  • (?<!\S) 断言白色space 边界向左
  • (?:非捕获组(为交替|)
    • [A-Za-z0-9]+ 匹配字符 class
    • 中列出范围的 1+ 次 1
    • (?:\.[A-Za-z0-9]+)+ 重复 1+ 次匹配 . 并重复 1+ 次字符 class
    • 中列出的内容
    • |
    • [A-Za-z0-9] 匹配字符范围内的单个字符 class
    • (?:\h+[A-Za-z0-9])* 可选择重复 1+ spaces 和单个字符
    • (?:非捕获组
      • \h+\.\h+[A-Za-z0-9] 匹配 1+ spaces,. 1+ spaces 并再次匹配一个字符
      • (?:\h+[A-Za-z0-9])* 可选择重复 1+ spaces 和单个字符
    • )+关闭非捕获组重复1次或多次
  • )关闭非捕获组
  • (?!\S) 断言白色space 边界向右

也许:

(?i)((?:[^.]\s+(?:[a-z0-9._]{1}\s+)+))|(\b[a-z0-9_.]+.com)

演示: