Php preg_match使用URL作为正则表达式

时间:2017-10-12 22:16:30

标签: php regex

我有一系列网址

[
  'http://www.example.com/eng-gb/products/test-1',
  'http://www.example.com/eng-gb/products/test-3',
  'http://www.example.com/eng-gb/about-us',
]

我需要为过滤器编写一个正则表达式,只有以:

结尾
http://www.example.com/eng-gb/products/(.*)

在这种情况下,我需要排除' about-us'。

我还需要使用'http://www.example.com/eng-gb/products/(.*)'作为正则表达式。

归档的最佳方式?

3 个答案:

答案 0 :(得分:1)

preg_grep()提供了较短的代码行,但由于要匹配的子字符串中似乎没有任何变量字符,因此最佳做法表明strpos()更适合。

代码:(Demo

$urls=[
  'http://www.example.com/eng-gb/products/test-1',
  'http://www.example.com/eng-gb/badproducts/test-2',
  'http://www.example.com/eng-gb/products/test-3',
  'http://www.example.com/eng-gb/badproducts/products/test-4',
  'http://www.example.com/products/test-5',
  'http://www.example.com/eng-gb/about-us',
];

var_export(preg_grep('~^http://www.example\.com/eng-gb/products/[^/]*$~',$urls));
echo "\n\n";
var_export(array_filter($urls,function($v){return strpos($v,'http://www.example.com/eng-gb/products/')===0;}));

输出:

array (
  0 => 'http://www.example.com/eng-gb/products/test-1',
  2 => 'http://www.example.com/eng-gb/products/test-3',
)

array (
  0 => 'http://www.example.com/eng-gb/products/test-1',
  2 => 'http://www.example.com/eng-gb/products/test-3',
)

一些注意事项:

使用preg_grep()

  • 使用非斜杠模式分隔符,这样您就不必转义模式中的所有斜杠。
  • .com
  • 处逃离点
  • 使用开始和结束锚点编写完整的域和目录路径,以便进行最严格的验证。
  • 在模式末尾附近使用否定字符类,以确保不添加其他目录(当然,除非您希望包含所有子目录)。
  • 我的模式将匹配以/products/结尾但不是/products的网址。这与您提问中的详细信息一致。

使用strpos()

  • 检查strpos()===0表示必须在字符串的开头找到子字符串。
  • 这将允许字符串末尾的任何尾随字符。

答案 1 :(得分:0)

我认为你需要使用preg_grep因为你有一些网址 这将返回符合条件的网址数组

$matches = preg_grep('/products\/.*$/', $urls);

并且您也可以在php中使用validate filters来验证网址

答案 2 :(得分:0)

您需要转义正斜杠和句点才能获得http:\/\/www\.example\.com\/eng-gb\/products\/(.*)。之后,您可以直接放置URL。

或者(更好)是搜索\/eng-gb\/products\/(.*)

示例:

$matches = array();
preg_match('/\/eng-gb\/products\/(.*)/', $your_url, $matches);
$product = $matches[1];