【问题标题】:php preg_match and regex regular expressionphp preg_match 和 regex 正则表达式
【发布时间】:2015-11-02 14:10:46
【问题描述】:

我想使用正则表达式:

/(.*)[.\s][sS](\d{1,20})[eE](\d{1,100}).*/i

过滤电视剧的标题。 (例如《生活大爆炸》S04E05)为了删除剧集字符串(S04E05)。

我已经用http://www.phpliveregex.com/ 测试了我的正则表达式,一切正常。但是将它包含在我的网站上,我会得到包括剧集字符串在内的整个标题。 preg_match的返回值为0。

我的代码:

$ret=preg_match("/(.*)[.\s][sS](\d{1,20})[eE](\d{1,100}).*/i", $title,$output);
if($ret==1){
    $title_without=$output[1];
}

【问题讨论】:

  • 然后准确显示$title 中的内容。如果我们看不到您输入的内容,我们将无法帮助您修复正则表达式。
  • 我认为是这样的:(例如生活大爆炸 S04E05)
  • $title="生活大爆炸 S04E24"
  • 使用phpliveregex.com 你会看到数组的第一个元素是整个字符串...你测试过数组的第二个元素吗...?
  • 是的,我这样做了...但是返回值还是0,我相信不会有符合的

标签: php regex preg-match


【解决方案1】:

请注意,在双引号字符串中,您需要使用双反斜杠来转义正则表达式速记类。

您可以在 单引号 内的 preg_replace 函数中使用您的正则表达式,这样您就不必使用双反斜杠:

$title= "The Big Bang Theory S04E05";
$ret=preg_replace('/^(.*)[.\s]s\d{1,20}e\d{1,100}(.*)/i', '\1\2', $title);
echo $ret;

IDEONE demo。结果:The Big Bang Theory

反向引用\1\2将恢复剧集子串前后的子串。

由于您使用/i修饰符,因此您无需使用[eE][Ss],任何情况下都只需使用单个字母即可。

要返回剧集之前的子字符串和剧集子字符串本身,只需使用带有preg_match 的捕获组,如下所示:

$title= "The Big Bang Theory S04E05";
$ret=preg_match('/^(.*)[.\s](s\d{1,20}e\d{1,100})/i', $title, $match);
echo $match[1] . PHP_EOL; // => The Big Bang Theory
echo $match[2];           // => S04E05

another demo

【讨论】:

  • 是否也可以获取剧集字符串?
  • 您的正则表达式的问题在我的回答开头说明。您在正则表达式声明中使用了双引号,因此,带有 \s 之类的类的反斜杠必须加倍。使用单引号时,您不必将双反斜杠作为 \,然后将其视为文字反斜杠。另外,我建议使用捕获组,以便我们可以访问我们感兴趣的详细信息。
  • 不客气。另外,如果你不关心se后面有多少位,你也可以使用\d+,不需要限制量词\d{min, max}
【解决方案2】:

您可以查找单词并匹配除最后一个以外的所有单词:

$matches = array();
$regex = "/^([\w ]*) [\w]+$/i";
$title = "The Big Bang Theory S04E05";
preg_match_all ($regex, $title, $matches);

现在你所有的比赛都在$matches

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2012-01-14
    相关资源
    最近更新 更多