PHP中的正则表达式 - 如何捕获字符的最后一个实例?

时间:2017-11-04 22:51:57

标签: php regex

我的代码。

"Piece Inspection Toolkit"

$string获得" - AWS 10-"因为第二个捕获组是" -"而不是" -"

如何让第二个捕获组成为{{1}}?

2 个答案:

答案 0 :(得分:2)

我将继续并对输入字符串进行一些合理的假设并授予正则表达式。

当你想要返回一个匹配时,

preg_replace()似乎是一个不必要的选择。因此,preg_match()更适合。

*我将使用var_export()来证明它是一个干净的,空间修剪的输出。

代码:(Demo

$strings=[
    "(ILLUSTRATION 1D) - AWS 10-Piece Inspection Toolkit",
    "(ILLUSTRATION 1-D) - AWS 10-Piece Inspection Toolkit",
    "(ILLUSTRATION 1D)- AWS 10-Piece Inspection Toolkit",
    "(ILLUSTRATION 1D) -AWS 10-Piece Inspection Toolkit",
    "(ILLUSTRATION 1-D)-AWS 10-Piece Inspection Toolkit"    
];
foreach($strings as $string){
    var_export(preg_match('/\)[ -]*\K.*/',$string,$match)?$match[0]:'no match');
    echo "\n";
}

输出:

'AWS 10-Piece Inspection Toolkit'
'AWS 10-Piece Inspection Toolkit'
'AWS 10-Piece Inspection Toolkit'
'AWS 10-Piece Inspection Toolkit'
'AWS 10-Piece Inspection Toolkit'

模式说明:

  • 匹配最早的)
  • 以任何顺序/顺序匹配零个或多个以下字符:space& hyphen
  • 使用\K
  • 重新启动全字符串匹配
  • 将字符串的其余部分与.*
  • 匹配

答案 1 :(得分:0)

您可以简化代码并按如下方式重新格式化:

<?php

$string = "(ILLUSTRATION 1D) - AWS 10-Piece Inspection Toolkit";

$pattern = "/.+\s+-\s*(.+)/";

$string = preg_replace($pattern, "$1", $string);


print_r($string);

请参阅live code

如果指示的模式匹配发生,函数preg_replace()将用“记住的”模式匹配替换字符串。

$string包含目标字符串。 $pattern由一个或多个字符后跟一个或多个空格组成,然后是连字符,可选地包含一个或多个空格,然后是一个或多个字符。最后一个或多个角色将在比赛中“记住”。因为这是唯一需要记住的模式,即$1包含的值。因此,当字符串发生模式匹配时,$string的内容将替换为$1的值。

或者,您可以使用preg_split(),如下所示:

<?php

$string = "(ILLUSTRATION 1D) - AWS 10-Piece Inspection Toolkit";
$pattern = "/\s+-\s*/";

$nustring = preg_split( $pattern, $string )[1];

print_r($nustring);

preg_split()的优点是它关注$ string的子串。此外,要拆分的模式很简单,一个或多个空格,然后是一个超级然后可选的一个或多个空格,后跟一个或多个字符。

请参阅live code