尽管我已经尝试过,但我似乎找不到正确的正则表达式来找到我在此之后所做的事情。
我只想从以下内容中选择与 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 );
我已经阅读了大量关于如何检测网址的文档,但无法找到有关检测特定网址的任何内容。
我真的无法掌握如何制定正则表达式,所以这个公式是不正确的。任何帮助将不胜感激。
编辑编辑这个问题更具体一点,希望更容易解决。
答案 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
\b(https?://)
(匹配整个字http
或https
后跟{{1 }}和://
(匹配1个或多个非空白字符)。这些捕获组在模式中标有(\S+)
,可以通过(...)
访问,其中 n 是捕获组的ID。更新
如果您只需要替换 第一次出现的网址 ,请将限制参数传递给preg_replace_callback
:< / p>
$matches[n]