我在变量 $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(如果存在)?
^/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
并将保存页码。
你可以使用:^/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
)
*/
我认为这样的事情可以工作:
$url = "/panel/33/asdasd-asdasd"; preg_match('/\/panel\/?([^\/]*)\/?([^\/]*)/i', $url, $matches); print_r($matches);
基本上表达式后跟?或 * 仅在它们存在时才匹配
从问题中可以看出,如果该段是数字,您只需要找出 url 中的第二段。
所以你可以这样做:
找出第二段 -> 检查它是否是一个数字 -> 如果你的测试是肯定的(即它是一个数字) -> 你已经获得了你想要的东西。
正则表达式的新手,但试试这个:
$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>";
}
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: '' }