Preg_match 单词的最后一个实例

Pregmatch last instance of a word

我想知道如何在 by 的最后一个实例之后匹配 word/s。例如下面我有一个 $books 的列表。这本书的格式是 <book title> by <author> 书名可以包含任何 character/s 或什么都不包含。但是,作者只能是字母、数字和下划线。我只想回应作者。

我设法通过 explode()rtrim()end() 的组合来做到这一点,但是我如何使用 preg_match / 正则表达式来做到这一点。

<pre><?php

$books = ['Big Blue Book by Steven', 'Dance by her by Mike', 'One day by by by', 'Hiphop Party by DJ340_Cool', ' by Paul12', 'by jasonB'];

foreach ($books as $book) {
    $temp = explode("by ", $book);
    $temp = rtrim(end($temp));
    echo("$temp\n");
}

我想要的结果:

Steven
Mike
by
DJ340_Cool
Paul12
jasonB

您可以使用此代码:

foreach ($books as $book) {
   if (preg_match('/^(?:.*\h)?by\h+(\S+)/', $book, $m))
      echo $m[1] . "\n";
}

输出:

Steven
Mike
by
DJ340_Cool
Paul12
jasonB

这里的正则表达式 (?:^.*\h)?by\h+(\S+) 匹配最后一个 by,由于之前使用了贪婪的 .*,两边都被 1+ 个空格包围。我们在第一个捕获组中捕获 1+ 个非空白并在 if 条件下打印它。