0

我在变量 $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(如果存在)?

4

6 回答 6

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

正则表达式可视化

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

于 2013-10-10T10:43:52.443 回答
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
)

*/
于 2013-10-10T10:50:14.293 回答
0

我认为这样的事情可以工作:

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

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

print_r($matches);

基本上表达式后跟?或 * 仅在它们存在时才匹配

于 2013-10-10T10:43:43.200 回答
0

从问题中可以看出,如果该段是数字,您只需要找出 url 中的第二段。

所以你可以这样做:

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

于 2013-10-10T10:46:45.300 回答
0

正则表达式的新手,但试试这个:

$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>"; 
}
于 2013-10-10T10:54:57.350 回答
0

演示

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: '' }
于 2013-10-10T10:57:51.023 回答