我想从右到左阅读字符串。例如,我想在下面的代码中从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
答案 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]);
修改强>
事实上,从右到左阅读很难。您可以做的是按/
分解网址,然后使用最后一部分来应用正则表达式:
<?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
之间的任何内容,那么正则表达式就是准确定位。