2014-05-14 51 views
0

我想按此顺序匹配一部分URL。只匹配字符串的一部分的正则表达式

首先,域名将保持静态。所以,没有任何与正则表达式检查。

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

+2

1.你真的需要阅读有关使用正则表达式2.你不需要正则表达式这个问题。 – anubhava

+0

@anubhava你不明白。 '/./'只是一个例子。它也可以是'\ d +'或任何其他模式。所以,正则表达式需要 – iOi

+1

[*正则表达式需要*](http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/)是一个非常大胆的陈述。 – Sam

回答

2

更新:

~^http://foo\.com/[a-z]+/?$~i 
~^http://foo\.com/[0-9]+/?$~ 
~^http://foo\.com/[a-z0-9]+/?$~i 

这些将是你的三个表达式匹配字母的网址,数字URL和字母。一对夫妇笔记,\w匹配[a-zA-Z0-9_]所以我不认为这是你的预期。你的角色类([])里面的+没有任何特殊的含义,就像你所期望的那样。 \w\d是“简写字符类”,不需要在[]语法内(但它们可以是,例如[\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+,使用.+。但是,这些将是贪婪的,并匹配你的整个字符串,并可能导致问题。您可以通过将?添加到它们的末尾来使其变得很懒(意思是一旦它看到下一个字符/就会停下来)。或者,您可以指定任何东西,但是使用负面字符类别[^/] a /

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" 
// } 
+0

获取错误'警告:preg_match():无结尾分隔符'〜'找到了' – iOi

+0

您复制了错误的表达式,请确保您有双方的'〜'......在编辑中查看我的PHP代码。 – Sam

+0

仍然没有回答这个问题。谢谢你的努力。 – iOi