正则表达式只匹配字符串的一部分

时间:2014-05-14 21:23:35

标签: regex

我想按此顺序匹配网址的一部分。

首先,域名将保持不变。所以,没有用正则表达式检查。

$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。

1 个答案:

答案 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+。但是,这些将是贪婪的,并匹配您的整个字符串,可能会导致问题。你可以通过在它们的末尾添加?来使它变得懒惰(意味着它会在看到下一个字符/时立即停止)。或者,您可以使用否定字符类/指定任何 [^/]

我的final regex of choice将是:

~^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"
// }
相关问题