正则表达式,用于在PHP中查找字符串中的特定URL

时间:2016-04-01 11:43:04

标签: php regex preg-match-all

我希望在大量文本中找到特定的网址,网址采用以下格式:

https://name.myurl.com/#/shop/ rmpa8cmnfg3eerpus3ap9jwekz6k77pnj2pg50ua /登录

*粗体部分是随机的。

目前,我可以使用以下内容推断所有网址:

preg_match_all('!https?://\S+!', $string, $matches); 

然后我需要循环并使用以下方法提取包含特定字符串的所有URL:

$arr = $matches[0];

foreach ($arr as $haystack) {

    if (strlen(strstr($haystack,"shop"))>0) {

      echo $haystack;

    }
}

我正在尝试使代码更有效,并且似乎无法找到可以找到所有匹配的匹配的正则表达式:

https://name.myurl.com/#/shop/rmpa8cmnfg3eerpus3ap9jwekz6k77pnj2pg50ua/login

如果可以,它将减轻进行第二次字符串查找的需要。

非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:1)

关键是你需要问自己在你需要匹配的字符串中有什么特别之处。如果URL包含感兴趣的子路径,如果子部分是第二个,或者从末尾开始的第二个,或者它包含字母和数字等。

一旦你知道匹配什么,就可以开始使用正则表达式了。

您似乎需要将网址与/shop/子路径匹配。然后,您只需要将该子模式包含在模式中。因为它是一个字面的字符序列,所以没有什么困难:

'~https?://\S+/shop/\S+~'
              ^^^^^^

请参阅regex demo

答案 1 :(得分:1)

如果您要做的只是验证/shop/部分是否是网址的一部分,请使用:

https?:\/\/\S*\/shop\/\S*

它基本上是你的正则表达式,在协议部分(http(s)://)之后增加了要求/shop/,并允许在商店部分之前和之后使用非空格字符。

此致