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