正则表达式从右到左阅读

时间:2013-02-03 17:05:35

标签: php regex

我想从右到左阅读字符串。例如,我想在下面的代码中从50940775获取$game

我提到了另一个stackoverflow问题。他们说使用$,但它不适合我。我使用下面的代码。

$game = 'http://www.myspace.com/sdsf/1223232/videos/video/50940775black';

preg_match('/\/(.*?)black$/', $game, $match);
print_r($match[1]);

注意:$game Url不同,如下所示

http://www.myspace.com/sdsf/1223232/black/video/50940775black
http://www.myspace.com/sdsf/1223232/videos/12345/50940775black
http://www.myspace.com/sdsf/1223232/videos/games129kj/5675999black

2 个答案:

答案 0 :(得分:1)

由于您想获取数字,因此您可以指定只需要它们([0-9]+)而不是所有内容(.*)。使用.*,它会检索找到的第一个/black之间的所有内容。因此,在您的情况下:/www.myspace.com/sdsf/1223232/videos/video/50940775black

试试这个:

$game = 'http://www.myspace.com/sdsf/1223232/videos/video/50940775black';

preg_match('/\/([0-9]+)black$/', $game, $match);
print_r($match[1]);

Live demo

修改

事实上,从右到左阅读很难。您可以做的是按/分解网址,然后使用最后一部分来应用正则表达式:

<?php

$game = explode('/', 'http://www.myspace.com/sdsf/1223232/videos/video/50940775black');
$data = end($game);

preg_match('/(.*?)black$/', $data, $match);
print_r($match[1]);

答案 1 :(得分:1)

尝试这样的事情:

$game = 'http://www.myspace.com/sdsf/1223232/videos/video/50940775black';
preg_match('/\/([^\/]+)black$/', $game, $match);
print_r($match[1]);

为什么以前不工作?这与贪婪的本质有关。非贪婪的运算符不会使正则表达式在字符串中找到最短的匹配。它找到不包含任何其他匹配项的第一个匹配项。如果你找到它找到的匹配并开始回溯,你将永远找不到与首先找到的匹配开头匹配的另一个子串。这是一个微妙的差异。

在写这篇文章时,我看到有人建议只寻找数字。这也会奏效,只要你确定会有什么只是数字。如果你的目的是抓住最接近的/black之间的任何内容,那么正则表达式就是准确定位。