如何在 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 ';
我要找
page.com
Page.Com
t e x t . c o m
TEXT.COM
$num_found = preg_match_all($pattern, ($str), $out)
但我只找到这个:
- [0] =>
page.com
- [1] =>
t . c
我的正则表达式看起来像这样
$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)
如果要多次匹配一个点:
(?<!\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)
(?<!\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)
演示:
我想检查垃圾邮件 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 ';
我要找
page.com
Page.Com
t e x t . c o m
TEXT.COM
$num_found = preg_match_all($pattern, ($str), $out)
但我只找到这个:
- [0] =>
page.com
- [1] =>
t . c
我的正则表达式看起来像这样
$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)
如果要多次匹配一个点:
(?<!\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)
(?<!\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)
演示: