preg_replace匹配字符之间的字符串,但排除某些字符 PHP


preg_replace matching a string between chars but exclude some chars PHP

我仍然在为preg_match模式而苦苦挣扎。 我将以下一组字符串存储在数组中。

$comics = array("ABSOLUTION RUBICON #4 (MR) $3.99","ABSOLUTION RUBICON #4 FINAL JUSTICE CVR (MR) $3.99","ABSOLUTION RUBICON #4 HAPPY KITTY PREMIUM CVR (MR) $9.99", "ABSOLUTION RUBICON #4 WRAP CVR (MR) $3.99","SONIC THE HEDGEHOG #253 REG CVR $2.99");
ABSOLUTION RUBICON #4 (MR) $3.99 
ABSOLUTION RUBICON #4 FINAL JUSTICE CVR (MR) $3.99 
ABSOLUTION RUBICON #4 HAPPY KITTY PREMIUM CVR (MR) $9.99 
ABSOLUTION RUBICON #4 WRAP CVR (MR) $3.99
SONIC THE HEDGEHOG #253 REG CVR $2.99

我想做一个preg_match,以便最终列表看起来像这样

ABSOLUTION RUBICON #4 (MR) $3.99 
SONIC THE HEDGEHOG #253 REG CVR $2.99
cleanComics = array("ABSOLUTION RUBICON #4 (MR) $3.99","SONIC THE HEDGEHOG #253 REG CVR $2.99");

为了提供上下文,这些是漫画标题,我想删除变体封面,但每隔一段时间,出版商就会溜进 REG CVR,我需要保留这个。

这些模式保持不变。

  • 漫画标题始终全部大写,并且位于字符串的开头,但它们将包含字母和数字的混合。
  • 问题编号跟随漫画标题,并以"#"符号开头 漫画标题 #000
  • 最后一组字符将是价格,它将始终使用"$"作为价格的开头。
  • 出现在"(("中的项目并不总是存在(这些可以删除,如果它使事情变得更容易,它们不是必需的(
  • 变体封面的名称会有所不同,并且可以包含数字和字母的组合,但字母 CVR 始终跟在变体封面的名称后面。

我认为问题编号的最后一位数字和 $ 符号可能是分隔符,我只是不确定如何构建匹配模式来执行此操作并排除 REG CVR 情况。

应该提到这是在PHP中完成的。

谢谢凯文

就像一个魅力:D

    <?
$comics = array("ABSOLUTION RUBICON #4 (MR) $3.99",
                "ABSOLUTION RUBICON #4 FINAL JUSTICE CVR (MR) $3.99",
                "ABSOLUTION RUBICON #4 HAPPY KITTY PREMIUM CVR (MR) $9.99", 
                "ABSOLUTION RUBICON #4 WRAP CVR (MR) $3.99",
                "SONIC THE HEDGEHOG #253 REG CVR $2.99");
$added = Array();
$output = Array();
foreach ($comics as $title){
    $temp = preg_replace("/ #([0-9])* (['''(]|[''')]|[a-z]|[ ]|[A-Z])* '''$*([0-9])*.([0-9])*/", "", $title);
    if (!in_array($temp, $added)){
        $added[count($added)] = $temp;
        $output[count($output)] = $title;
    }
}
foreach ($output as $data){
    echo "$data<br>";
}
?>

只是一个评论:

如果您有:

 $comics = array("ABSOLUTION RUBICON #4 (MR) $3.99",
            "ABSOLUTION RUBICON #5 FINAL JUSTICE CVR (MR) $3.99",
            "ABSOLUTION RUBICON #6 HAPPY KITTY PREMIUM CVR (MR) $9.99", 
            "ABSOLUTION RUBICON #7 WRAP CVR (MR) $3.99",
            "SONIC THE HEDGEHOG #253 REG CVR $2.99");

输出仍然只有 2 个结果。如果您想要这种情况的 5 个结果,则需要将正则表达式更改为此结果:

$temp = preg_replace("/(['''(]|[''')]|[a-z]|[ ]|[A-Z])* '''$*([0-9])*.([0-9])*/", "", $title);
您可以使用

preg_replace:

$result = preg_replace('~#[0-9]++ 'K.*?CVR~', '', $comics);