我有这种格式的数据来自数据库......
BUS 101S Business and Society
或
BUS 101 Business and Society
注意可选的“S”字符(可以是任何大写字符)
我需要用null替换“BUS 101S”部分,这就是我想出来的......
$value = "BUS 101S Business and Society";
$sub = substr($value, 0, 3); // Gives me "BUS"
$num = substr($value, 4, 3); // Gives me "101"
$new_value = preg_replace("/$sub $num"."[A-Z]?/", null, $value);
$new_value
的值现在包含S Business and Society
。所以我很接近,只需要它来替换可选的单个大写字符。有什么想法吗?
答案 0 :(得分:8)
假设模式是3个大写字母,3个数字,然后是可选的大写字母,只需使用一个preg_match
:
$new = preg_replace('/^[A-Z]{3} \d{3}[A-Z]?/', '', $old);
^
只会在行/字符串的开头匹配。 {3}
表示"匹配前面的令牌3次"。 ?
表示"匹配前一个令牌零或一次"
答案 1 :(得分:1)
你也可以这样做,所以你不要打扰substr:
preg_replace('#^[A-Z]{3} [0-9]{3}[A-Z]? (.*)$#', '$1', $value);
或者使用preg_match来获取字符串的所有组件
if (preg_match('#^([A-Z]{3}) ([0-9]{3})([A-Z]?) (.*)$#', $value, $matches)) {
$firstMatch=$matches[1];//BUS ($matches[0] is the whole string)
$secondMatch=$matches[2];//101
$secondMatch=$matches[3];//S or ''
$secondMatch=$matches[4];//the rest of the text
}
答案 2 :(得分:0)
做这样的事情不会更容易:
$str = 'BUS 101S Business and Society';
$words = explode(' ', $str);
array_unshift($words); // bus
array_unshift($words); // 101s
$str = implode(' ', $words);