使用 PHP preg_replace 将标识符转换为吸引人的标题
Using PHP preg_replace to convert identifiers to an appealing title
对于一个面向历史的小型项目,我希望将标识符(用于链接)转换为吸引人的标题。下面是五个示例,说明如何调用标识符以及我如何尝试使它们看起来像。但是,不幸的是我无法弄清楚。
在PHP中是否有针对此类问题的优雅解决方案?
[identifier] = [title]
- 1904 = 1904
- 1904-1905 = 1904/05
- 1904-1905-法国 = 1904/05 法国
- 1904-1905-france-germany = 1904/05 法国 德国
- 1904-1905-france-germany-西班牙 = 1904/05 法国德国西班牙
这应该适合你:
只需使用 preg_replace_callback()
将您的字符串转换成您期望的格式,例如
<?php
$str = "1904-1905-france-germany";
echo $str = preg_replace_callback("/(\d+)(?:-(\d+))?(.*)/", function($m){
if(!empty($m[2]))
return $m[1] . "/" . substr($m[2], -2) . implode(" ", str_replace("-", " ", array_map("ucfirst", explode("-", $m[3]))));
return $m[1];
}, $str);
?>
输出:
1904/05 France Germany
将所有元素放入数组中,并按数组元素计数过滤和格式化结果也可以:
$subject2 = '1904-1905-france-germany-spain';
$new = explode('-', $subject2);
if(count($new) == 2){
echo $name = $new[0] . '/' . substr($new[1], 2);
} elseif (count($new) > 2) {
$name = $new[0] . '/' . substr($new[1], 2);
for($i = 2; $i<count($new); $i++ ){
$name.= ' ' . ucfirst($new[$i]) . ' ';
}
$name = trim($name, ' ');
echo $name;
}
对于一个面向历史的小型项目,我希望将标识符(用于链接)转换为吸引人的标题。下面是五个示例,说明如何调用标识符以及我如何尝试使它们看起来像。但是,不幸的是我无法弄清楚。
在PHP中是否有针对此类问题的优雅解决方案?
[identifier] = [title]
- 1904 = 1904
- 1904-1905 = 1904/05
- 1904-1905-法国 = 1904/05 法国
- 1904-1905-france-germany = 1904/05 法国 德国
- 1904-1905-france-germany-西班牙 = 1904/05 法国德国西班牙
这应该适合你:
只需使用 preg_replace_callback()
将您的字符串转换成您期望的格式,例如
<?php
$str = "1904-1905-france-germany";
echo $str = preg_replace_callback("/(\d+)(?:-(\d+))?(.*)/", function($m){
if(!empty($m[2]))
return $m[1] . "/" . substr($m[2], -2) . implode(" ", str_replace("-", " ", array_map("ucfirst", explode("-", $m[3]))));
return $m[1];
}, $str);
?>
输出:
1904/05 France Germany
将所有元素放入数组中,并按数组元素计数过滤和格式化结果也可以:
$subject2 = '1904-1905-france-germany-spain';
$new = explode('-', $subject2);
if(count($new) == 2){
echo $name = $new[0] . '/' . substr($new[1], 2);
} elseif (count($new) > 2) {
$name = $new[0] . '/' . substr($new[1], 2);
for($i = 2; $i<count($new); $i++ ){
$name.= ' ' . ucfirst($new[$i]) . ' ';
}
$name = trim($name, ' ');
echo $name;
}