正则表达式仅适用于URL中的特定域名

时间:2015-12-02 12:18:36

标签: php regex

尽管我已经尝试过,但我似乎找不到正确的正则表达式来找到我在此之后所做的事情。

我只想从以下内容中选择与 www.myweb.com 域匹配的网址的第一个实例...

Some text https://www.myweb.com/page/cat/323123442321-rghe432 and then another https://www.adifferentsite.com/fsdhjss/erwr

我需要完全忽略第二个网址 www.adifferentsite.com ,并且只能使用匹配 www.myweb.com 的第一个网址,忽略任何其他可能的实例 www.myweb.com

一旦找到第一个匹配的域名,我需要存储其后的其余网址...

page/cat/323123442321-rghe432

...进入一个新变量$ newvar,所以......

$newvar = 'page/cat/323123442321-rghe432';

我正在尝试:

return preg_replace_callback( '/http://www.myweb.com/\/[0-9a-zA-Z]+/', array( __CLASS__, 'my_callback' ), $newvar );

我已经阅读了大量关于如何检测网址的文档,但无法找到有关检测特定网址的任何内容。

我真的无法掌握如何制定正则表达式,所以这个公式是不正确的。任何帮助将不胜感激。

编辑编辑这个问题更具体一点,希望更容易解决。

1 个答案:

答案 0 :(得分:1)

您可以使用preg_replace_callback并将数组传递给匿名函数(或只是您的自定义回调函数),以使用所有必要的URL部分填充它。

这是demo

$rests = array();
$re = '~\b(https?://)www\.myweb\.com/(\S+)~'; 
$str = "Some text https://www.myweb.com/page/cat/323123442321-rghe432 and then another https://www.adifferentsite.com/fsdhjss/erwr"; 
echo $result = preg_replace_callback($re, function ($m) use (&$rests) {
    array_push($rests, $m[2]);
    return $m[1] . "embed.myweb.com/" . $m[2];
}, $str) . PHP_EOL;
print_r($rests);

结果:

Some text https://embed.myweb.com/page/cat/323123442321-rghe432 and then another https://www.adifferentsite.com/fsdhjss/erwr
Array
(
    [0] => page/cat/323123442321-rghe432
)

几句话:

  • '~\b(https?://)www\.myweb\.com/(\S+)~'~作为 regex delimiter ,因此您无需转义/
  • 使用单引号文字声明它,因此您不必为\\S
  • 使用双重转义
  • 匹配并捕获到 capturing groups 2个子字符串:\b(https?://)(匹配整个字httphttps后跟{{1 }}和://(匹配1个或多个非空白字符)。这些捕获组在模式中标有(\S+),可以通过(...)访问,其中 n 是捕获组的ID。

更新

如果您只需要替换 第一次出现的网址 ,请将限制参数传递给preg_replace_callback:< / p>

$matches[n]

请参阅another IDEONE demo