Php 我正在寻找使用以下正则表达式匹配所有wikimedia站点的模式。但它没有';不匹配

Php 我正在寻找使用以下正则表达式匹配所有wikimedia站点的模式。但它没有';不匹配,php,regex,Php,Regex,字符串:https://www.wikidata.org/wiki/Wikidata:Main_Page 我正在使用parse_url()解析url以提取主机,然后使用preg_match() 检查似乎仍然失败。*不是通配符。它与上一个字符的0个或多个匹配 if(preg_match($blacklistedTemplate, $urlData['host'])) 匹配任何字符: wik.org wiki.org wikii.org wikiii.org 你可以检查正则表达式 从re_格式-

字符串:
https://www.wikidata.org/wiki/Wikidata:Main_Page

我正在使用parse_url()解析url以提取主机,然后使用
preg_match()


检查似乎仍然失败。

*
不是通配符。它与上一个字符的0个或多个匹配

if(preg_match($blacklistedTemplate, $urlData['host']))
匹配任何字符:

wik.org
wiki.org
wikii.org
wikiii.org
你可以检查正则表达式

re_格式--POSIX 1003.2正则表达式

原子是[…]'。(匹配任何单个字符)[…]

后跟“*”的原子匹配该原子的0个或多个匹配项的序列

“*”(星,Kleene星运算符)是一个量词(0-n次),“[]”是字符类的定义(以下之一)

因此,您的正则表达式转换为: 匹配:“wik”,然后匹配“i”(0-n次),然后匹配“.”和“org”中的任何一个

这确实是错误的,必须纠正:

“/wiki.[.]org/i”

PHP中的parse_url()将返回以下数组:

/wiki.*[.]org/i
因此,可能的解决方案如下所示:

Array ( [scheme] => https [host] => www.wikidata.org [path] => /wiki/Wikidata:Main_Page )
Array ( [scheme] => http [host] => nl.wikipedia.org [path] => /wiki/Brainfuck )

注意:例如,Wikipedia以语言(nl、en等)开始,因此您必须将所有这些语言添加到列表中

Matteo的回答允许我检查所有子域,而无需列出每种语言。此外,我们不需要跟踪随着时间的推移可能添加的新语言。是的,它会。我将继续做那件事。
Array ( [scheme] => https [host] => www.wikidata.org [path] => /wiki/Wikidata:Main_Page )
Array ( [scheme] => http [host] => nl.wikipedia.org [path] => /wiki/Brainfuck )
(en|nl|www).wiki.*[.]org