3

我仍然与 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,我需要保留这个。

这些模式保持不变。

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

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

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

谢谢凯文

4

2 回答 2

1

这就像一个魅力: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);
于 2013-10-01T17:40:01.467 回答
-1

您可以使用 preg_replace:

$result = preg_replace('~#[0-9]++ \K.*?CVR~', '', $comics);
于 2013-10-01T17:39:01.227 回答