正则表达式全局模式匹配

时间:2013-12-10 11:20:27

标签: php regex

我不重复系列中的单位(例如,4,6.5,8和12厘米),除了每个数字后重复% 该系列可以是任何长度,因此我希望正则表达式是全局的。 我附上了我的示例程序。

<?php
$match = '4 CM,6.5 CM';

$replacement='$1$2$3';
$replac = preg_replace('/(,?\d+\s?\W?)\w+?(,?\d+\s?\W?)(\w+)?/',
                   $replacement,
                   $match);
echo $replac;
?>

输入:

4 CM,6.5 CM

输出:

4 ,6.5 CM

预期结果:

输入:

4 cm,6.5 cm,8 cm,9 cm and 10 cm  //the series can be of any length

输出:

4,6.5,8,9 and 10 cm   //units at the end

帮助我将我的正则表达式作为一个全局的。所以它可以检查任意数量的系列。 感谢。

2 个答案:

答案 0 :(得分:2)

我认为你是在思考这个问题。只需从字符串中删除所有cm,但最后一个除外。

$str = '4 cm,6.5 cm,8 cm,9 cm and 10 cm';
$out = preg_replace('/ cm(?!$)/i', '', $str);

输出:4,6.5,8,9 and 10 cm

正则表达式解释说:

/ cm(?!$)/i
 \ /\   / ^
  |  \ /  |
  |   |   `-- Case insensitive
  |   `------ Negative lookahead, do not match if end of string
  `---------- Match " cm" literally

See it run

对于更通用的方法(捕获任何单位):

 / [^,]+(?=,| and )/i
  \    /\ /\     /  ^
   \  /  |  \   /   |
    \/   |   \ /    `-- Case insensitive
    |    |    `-------- Literal "," or " and "
    |    `------------- Positive lookahead, require following pattern
    `------------------ Capture until first comma (+ means 1 or more)

See it run

答案 1 :(得分:1)

$a = '4 cm,6.5 cm,8 cm,9 cm and 10 cm';
$exploded = explode(' and ', $a);
$爆炸[0]是“4厘米,6.5厘米,8厘米,9厘米”

$爆炸[1]是“10厘米”

现在让我们删除“cm”

$beforeAnd = preg_replace('/ cm/', '', $exploded[0]);

$ beforeAnd是“4,6.5,8,9”

$afterAnd = $exploded[1];

$ afterAnd是“10 cm”

$result =  $beforeAnd . ' and ' . $afterAnd;

“4cm,6.5cm,8cm,9cm”+“和”+“10cm”