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
条件下打印它。
我想知道如何在 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
条件下打印它。