获取第一个分隔符和最后一个点之间的字符串

问题描述

很抱歉,我是一个非常老的开发人员。 6年前因严重脑梗塞停止发育后,我的脑袋已经不那么新鲜了,我忘记了很多事情,而且,正如你所看到的,一个简单的。

我想对我 10 年前制作的旧脚本进行一些更新,我用它来订购和管理我的电子书收藏。

从朋友那里得到了一些新的电子书,我现在需要从文件提取作者姓名:

$file_name = Bitcoin en andere cryptovaluta - Mary-Jane Lasterie-Janssen.epub
$file_name = Fur - Grazia Hattem-Le Clercq.epub
$file_name = Sprookjes van Planeet Ur - Grazia Hattem-Le Clercq.epub
Het jasje van Luis Martin - Gilles van der Loo.epub
La divina commedia - dante Alighieri.epub

我需要获取一个分隔符和扩展名前的点之间的完整作者姓名。

我尝试为此使用 preg_replace() 并且它适用于这种情况,其中字符串中只有一个分隔符:

$author_name = preg_replace('/(.*)-(.*)\.epub/','$2',$file_name);
Het jasje van Luis Martin - Gilles van der Loo.epub
La divina commedia - dante Alighieri.epub

但当字符串中有多个分隔符时则不然。

在我得到作者的名字后,我想要没有名字的 .epub 所以我最终会得到这个结果:

原始 .epub 文件

$file_name = Bitcoin en andere cryptovaluta - Mary-Jane Lasterie-Janssen.epub  

我需要什么:

$author_name = Mary-Jane Lasterie-Janssen
$file_name   = Bitcoin en andere cryptovaluta.epub  

对此的任何帮助将不胜感激。

解决方法

你可以使用类似的东西

$filename = 'Bitcoin en andere cryptovaluta - Mary-Jane Lasterie-Janssen.epub';
$author = "";
$filename = preg_replace_callback('~(.*) - (.*)\.epub~',function ($m) use (&$author) 
 { $author = $m[2]; return $m[1] . ".epub"; },$filename);
echo "Author = $author\nFilename = $filename"; 
// => Author = Mary-Jane Lasterie-Janssen
//    Filename = Bitcoin en andere cryptovaluta.epub

参见PHP demo

正则表达式匹配如下:

  • (.*) - 第 1 组:除换行符以外的任何零个或多个字符,尽可能多(因此,从后续模式的开始到最后一次出现)
  • - - 空格、连字符、空格
  • (.*) - 第 2 组:除换行符以外的零个或多个字符,尽可能多
  • \.epub - .epub 字符串。

preg_replace_callback 函数用于“同时”替换正则表达式并提取正则表达式匹配的一部分。 $author 被传递给匿名函数,用作带有 & 前缀的替换参数,以便它可以被写入(重新分配)一个值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...