PHP使用正则表达式从url中提取片段

时间:2013-10-10 10:26:05

标签: php regex

我已经在变量$ url中存储了一个URL。 $ url可以是:

/panel
/panel/<pages>
/panel/<XX>
/panel/<XX>/<pages>

其中:

panel is a fixed string
<pages> is an aribtary string
<XX> is a number (1 to infinite digits)

如何使用php中的正则表达式来爆炸并获取$ number(如果存在)和$ page(如果存在)?

6 个答案:

答案 0 :(得分:1)

^/panel(/[a-zA-Z]+)?(/\d+)?$

匹配

/panel
/panel/23
/panel/apple
/panel/apple/1234

不匹配:

/panel/
/panel/23/apple
/panel/apple/123/12
/panel/apple/pear

Regular expression visualization

如果匹配,此正则表达式只返回true,否则返回false。有很多关于如何在PHP中使用正则表达式的教程,以及如何从中获取所需的部分。在这种情况下,$1将保留页面名称,$2将保留页码。

答案 1 :(得分:1)

您可以使用:^/panel(?:/(\d*)/?(\w*)/?)?$

$strs = array(
    '/panel'
    ,'/panel/pages'
    ,'/panel/69'
    ,'/panel/69/pages'
);
foreach($strs as $str)
{
    preg_match('#^/panel(?:/(\d*)/?(\w*)/?)?$#',$str,$matches);
    list($orig,$number,$pages) = array_pad($matches,3,false);
    echo "<pre>";
    print_r(compact('orig','number','pages'));
    echo "</pre>";
}
/* OUTPUT:

Array
(
    [orig] => /panel
    [number] =>
    [pages] =>
)

Array
(
    [orig] => /panel/pages
    [number] =>
    [pages] => pages
)

Array
(
    [orig] => /panel/69
    [number] => 69
    [pages] =>
)

Array
(
    [orig] => /panel/69/pages
    [number] => 69
    [pages] => pages
)

*/

答案 2 :(得分:0)

我觉得这样的事情可以奏效:

$url = "/panel/33/asdasd-asdasd";

preg_match('/\/panel\/?([^\/]*)\/?([^\/]*)/i', $url, $matches);

print_r($matches);

基本上是表达式?或者*只有在它们存在时才匹配

答案 3 :(得分:0)

问题中出现的是,您只需要在网址中找到第二个细分,以防该细分是一个数字。

所以你可以这样做:

找出第二段 - &gt;检查它是否为数字 - &gt;如果你的测试是肯定的(即它是一个数字) - &gt;你已经获得了你想要的东西。

答案 4 :(得分:0)

regexp的新手,但试试这个:

$urls = array();
$urls[] = "/panel";
$urls[] = "/panel/something";
$urls[] = "/panel/12";
$urls[] = "/panel/42/something else";

foreach($urls as $url)
{
    echo "evaluating: '$url'";
    preg_match("|/panel(?:/)?([0-9]*)?(?:/)?(.*)?|",$url,$matches);
    echo "<pre>"; 
    var_dump($matches);
    echo "</pre>"; 
}

答案 5 :(得分:0)

Demo

function parsePath($url) {
  $number = NAN;
  $page = '';
  $found_number = false;
  $found_page = false;

  $parsed = parse_url($url);
  $pathArr = [];

  if (isset($parsed['path']))
    $pathArr = explode('/', $parsed['path']);

  foreach ($pathArr as $path) {
    if (is_numeric($path) && !$found_number) {
      $number = $path;
      $found_number = true;
      continue;
    }
    if (!empty($path) && preg_match('/[^(panel)]/', $path) && !$found_page) {
      $page = $path;
      $found_page = true;
      continue;
    }
  }
  echo "Parsed Url = { Number: $number, Page: '$page' }\n";
}

parsePath('http://www.google.com/panel/123/page1');
parsePath('http://www.google.com/panel/page1/123');
parsePath('http://www.google.com/panel/123');
parsePath('http://www.google.com/panel/page1');
parsePath('http://www.google.com');

结果:

Parsed Url = { Number: 123, Page: 'page1' }
Parsed Url = { Number: 123, Page: 'page1' }
Parsed Url = { Number: 123, Page: '' }
Parsed Url = { Number: NAN, Page: 'page1' }
Parsed Url = { Number: NAN, Page: '' }