php正则表达式匹配Facebook页面,组和用户名,但忽略带有查询参数的链接

时间:2019-04-10 13:29:24

标签: php regex

我有这些可能的比赛

import pandas as pd
import pyodbc

conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=SERVER\DEV;'
                      'Database=Clusteranalysis;'
                      'Trusted_Connection=yes;')
cursor = conn.cursor()
query = 'SELECT * FROM [Clusteranalysis].[dbo].[Data] WHERE Rc=0'
result_port_map = pd.read_sql(query, conn)
print(result_port_map.head(5))

最后3个有效,但我想使用preg_match_all排除的第一个

当前

我有这个正则表达式,其中包括所有四个,第一个正则表达式匹配

https://www.facebook.com/tr?id=13046212397316299911&ev=pageview&noscript=1
https://www.facebook.com/pages/something
https://www.facebook.com/groups/something/
https://www.facebook.com/something
... random other non-facebook links

但是我想完全排除它

这是我当前的正则表达式

https://www.facebook.com/tr

另外,当它匹配时,$ matches在[0]和[1]和[2]中都包含一些东西,我不知道为什么会这样。我只想要一场比赛或没有一场比赛

请帮忙吗?

 $pattern = "/(?:(?:http|https):\/\/|)(?:www\.|)facebook\.[a-z.]+\/((pages|groups)\/|)[a-zA-Z0-9\-_]{1,}/"

1 个答案:

答案 0 :(得分:1)

在模式中,您使用2个交替,其中最后一个|之后没有任何值。 http或https部分可以缩短为https吗?并且包括www.的那部分不必位于非捕获组(?:中。

您可以将正斜杠移到组中以匹配页面或组,并使用问号使该组为可选。然后在末尾匹配一个可选的正斜杠。

如果使用其他定界符,则/(例如~)不必转义正斜杠。

您的正则表达式可能如下:

^https://www\.facebook\.[a-z.]+/(?:pages/|groups/)?[\w-]+/?$

Regex demo | Php demo

例如:

$pattern = '~^https://www\.facebook\.[a-z.]+/(?:pages/|groups/)?[\w-]+/?$~';

如果您想匹配更多而不是查询字符串参数,则可以使用否定的字符类[^?\s]+来匹配1+而不是问号或空格字符。

^https://www\.facebook\.[a-z.]+/(?:pages/|groups/)?[^?\s]+$

Regex demo | Php demo