我想按此顺序匹配网址的一部分。
首先,域名将保持不变。所以,没有用正则表达式检查。
$domain_name = "http://foo.com/";
我想要验证的是最后一次/
之后的内容。
所以,我的目标是创造类似的东西。
$stings_only = "[\w+]";
$number_only = "[\d+]";
$numbers_and_strings = "[0-9][a-z][A-Z]";
现在,我想使用上述变量来检查URL是否确认了所提到的模式。
$example_url = "http://foo.com/some-title-with-id-1";
var_dump(preg_match({$domain_name}{$strings_only}, $example_url));
上面应该返回false,因为title不是$ string_only。
$example_url = "http://foo.com/foobartar";
var_dump(preg_match({$domain_name}{$strings_only}, $example_url));
上面应该返回true,因为title是$ string_only。
答案 0 :(得分:2)
<强>更新强>
~^http://foo\.com/[a-z]+/?$~i
~^http://foo\.com/[0-9]+/?$~
~^http://foo\.com/[a-z0-9]+/?$~i
这些是您的三个表达式,用于匹配字母网址,数字网址和字母数字。有几个笔记,\w
匹配[a-zA-Z0-9_]
,所以我不认为这是你的预期。你的角色类+
里面的[]
没有任何特殊含义,就像你期望的那样。 \w
和\d
是&#34;速记字符类&#34;并且不需要在[]
语法范围内(但它们可以是,例如[\w.,]
)。请注意i
修饰符,这会使表达式不区分大小写,因此我们不需要使用[a-zA-Z]
。
$strings_only = '~^http://foo\.com/[a-z]+/?$~i';
$url = 'http://foo.com/some-title-with-id-1';
var_dump(preg_match($strings_only, $url)); // int(0)
$url = 'http://foo.com/foobartar';
var_dump(preg_match($strings_only, $url)); // int(1)
使用Regex101测试/调整上述所有表达式。
.
匹配任何字符,但只匹配一次。使用.*
表示0+或.+
表示1+。但是,这些将是贪婪的,并匹配您的整个字符串,可能会导致问题。你可以通过在它们的末尾添加?
来使它变得懒惰(意味着它会在看到下一个字符/
时立即停止)。或者,您可以使用否定字符类/
指定任何 但 [^/]
。
~^https://stolak\.ru/([^/]+)/?$~
请注意~
分隔符,这样您就不需要每个/
转义一次。此外,您需要使用.
转义\
,因为它具有特殊含义。我将[^/]+
URI参数放入捕获组,并使用/?
使尾随斜杠可选。最后,我将其锚定到字符串的开头和结尾(分别为^
和$
)。
你的问题有点模糊,所以我试着解释你想要匹配的内容。如果我错了,请告诉我,我可以更新它。但是,我试图解释这一切,以便您可以根据自己的需要学习和调整它。此外,使用我的Regex101链接 - 它将使测试更容易。
<强>实施强>
$pattern = '~^https://stolak\.ru/([^/]+)/?$~';
$url = 'https://stolak.ru/car-type-b1';
preg_match($pattern, $url, $matches);
var_dump($matches);
// array(2) {
// [0]=>
// string(29) "https://stolak.ru/car-type-b1"
// [1]=>
// string(11) "car-type-b1"
// }