我有这个网址类型: /segment1/segment2
我需要专注于包含项目的 id 或代码以及其他一些 slug 或日期等信息的 segment2。
例: /segment1/123-title-of-the-item
或/segment1/title-of-the-item-123
或/segment1/DLCK34Z-other-text
等等..
让我们考虑第一个示例:
该模型/segment1/{id}-{slug}
为了从数据库中获取项目,我需要从"123-标题项目"中识别id。
我需要得到一个数组,如下所示:
['id'] => 123
['slug'] => title-of-the-item
换句话说,在任何情况下,我都需要知道 url 的哪个子字符串对应于 patner 元素。
{
和 }
之间的所有字段都是数据库表上的字段,我已经知道项目的表名。
你有什么脚本、类、函数或建议吗?
朴素实现:
<?php
$url = '/segment1/x-title-of-the-item-123';
// Get the last segment / part
$urlParts = explode('/', $url);
$lastPart = end($urlParts);
// Get ID and slug
$candidates = explode('-', $lastPart);
if ($object = findObjectById(current($candidates))) {
echo 'ID is at the beginning';
} else if ($object = findObjectById(array_pop($candidates))) {
echo 'ID is at the end';
} else {
// No valid ID anywhere
throw new Exception('Database record not found');
}
// This is a dummy function, replace it with your own implementation
// that tries to find the database recod by the id.
// Attention: ID can be a string or a bool (false).
function findObjectById($id)
{
// Return the database record if it exists or null/false if not
// Attention: Won't work with the code above if 0 is a valid result!
return ((int) $id > 0);
}
但是,我很确定其他人会想出更好的主意。
更新:好的,如果DLCK34Z不是ID,那么我的尝试不适用于这种情况。你当然可以用"findObjectByCode"方法扩展它,但事情会变得混乱。