PHP正则表达式替换中的可选字符

时间:2012-03-27 18:31:31

标签: php regex

我有这种格式的数据来自数据库......

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。所以我很接近,只需要它来替换可选的单个大写字符。有什么想法吗?

3 个答案:

答案 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);