我想将街道地址转换为Title Case。这不完全是Title Case,因为一串数字末尾的字母应该是大写的。例如史密斯街19号。
我知道我可以使用
将“19史密斯街”改为“19史密斯街”$str = ucwords(strtolower($str))
但是将“19a史密斯街”改为“19a史密斯街”。
如何将其转换为“19A史密斯街”?
答案 0 :(得分:4)
另一种方法,虽然这是一种非常自定义的行为,但更长,但可能更容易调整其他不可预测的情况。
$string = "19a smith STREET";
// normalize everything to lower case
$string = strtolower($string);
// all words with upper case
$string = ucwords($string);
// replace any letter right after a number with its uppercase version
$string = preg_replace_callback('/([0-9])([a-z])/', function($matches){
return $matches[1] . strtoupper($matches[2]);
}, $string);
echo $string;
// echoes 19A Smith Street
// 19-45n carlsBERG aVenue -> 19-45N Carlsberg Avenue
答案 1 :(得分:1)
这是你可以使用正则表达式的一条路线。
class AdminManagerCanVisitController < ApplicationController
before_filter :admin_or_manager_authenticate
class AdminEmployeeCanVisitController < ApplicationController
before_filter :admin_or_employee_authenticate
class AdminOutsiderCanVisitController < ApplicationController
before_filter :admin_or_outsider_authenticate
class AdminManagerEmployeeCanVisitController < ApplicationController
before_filter :admin_or_manager_employee_authenticate
输出:
史密斯街19A号
正则表达式演示:https://regex101.com/r/nS9rK0/2
PHP演示:http://sandbox.onlinephpfunctions.com/code/febe99be24cf92ae3ff32fbafca63e5a81592e3c
答案 2 :(得分:1)
根据Juank的回答,我实际上最终使用了。
$str = preg_replace_callback('/([0-9])([a-z])/', function($matches){
return $matches[1] . strtoupper($matches[2]);
}, ucwords(strtolower($str)));
答案 3 :(得分:0)
您可以将该行拆分为2个子串,分别格式化每个子串,然后再将2个子串重新组合在一起。
$str = '19a smith STREET';
$split = strpos($str, ' ');
$str1 = strtoupper(substr($str, 0, $split + 1));
$str2 = ucwords(strtolower(substr($str, $split + 1)));
$str = $str1 . $str2;
echo $str;
结果:史密斯街19号
PHP演示:http://sandbox.onlinephpfunctions.com/code/9119643624c77b0c9cc584150e556a5d92c92981