我的代码。
"Piece Inspection Toolkit"
我$string
获得" - AWS 10-"
因为第二个捕获组是" -"
而不是" -"
。
如何让第二个捕获组成为{{1}}?
答案 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