根据模式选择或剪切字符串

时间:2014-03-04 14:34:23

标签: php regex

假设我有以下输入:

Mission ... some Text ... to Planet 1

现在,模式(regEx)应该识别这个字符串:

/Mission.*Planet \d{1}/

因此,其中包含MissionPlanet {any number}的每个字符串都应该有效。

但是有可能通过号码获得星球吗?在这种情况下,它是Planet 1的任务,是否可以从输入中获取字符串Planet 1

如果输入为Mission to Planet 3,我需要字符串Planet 3

您不能简单地使用substr() - 函数,因为MissionPlanet {any number}

之间存在未知数量的字符

如果字符串包含Mission {any amount of text} Planet {any number},是否需要首先检查,然后再次检查Planet {any number} preg_match($regEx, $input, $matches)

$input = "Mission blablabla to Planet 5";
$regex = "/Mission.*Planet \d{1}/";

if(preg_match($regex, $input)) {
    $regexNew = "/Planet \d{1}/";
    preg_match($regexNew, $input, $match));

}

那么$match包含带有数字的行星?

或者有更优雅的方式吗?

2 个答案:

答案 0 :(得分:1)

匹配和捕获可以使用单个preg_match()

完成
Mission.*?(Planet \d)

上面的英文表达:匹配“Mission”后跟任何字符串,直到“Planet”(懒惰)并捕获后面的数字。如果行星的数量可能大于9,请使用\d+代替\d

$input = "Mission blablabla to Planet 5";
$regex = "/Mission.*?(Planet \d)/";

if(preg_match($regex, $input, $match)) {
    echo $match[1]; // => 'Planet 5'
}

答案 1 :(得分:1)

您可以使用捕获组:

preg_match('/Mission.*(Planet \d+)/', $input, $match);

然后使用:

$match[1];

这会给你Planet X(其中X是数字)。