1

文字列を右から左に読みたい。たとえば、以下のコード50940775から取得したいとします。$game

別のスタックオーバーフローの質問を参照しました。彼らは を使用するように言いまし$たが、私にはうまくいきません。以下のコードを使用します。

$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
4

2 に答える 2

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]);

ライブデモ

編集:

実際、右から左に読むのは難しいです。あなたができることは、URLを分解し/、最後の部分を使用して正規表現を適用することです。

<?php

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

preg_match('/(.*?)black$/', $data, $match);
print_r($match[1]);
于 2013-02-03T17:09:35.947 に答える
1

代わりに次のようにしてみてください。

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

なぜ以前は機能しなかったのですか?それは貪欲の性質と関係があります。非貪欲な演算子は、正規表現が文字列内で可能な限り短い一致を検出する原因にはなりません。他の一致を含まない最初の一致を見つけます。見つかった一致を取得してバックトラックを開始すると、最初に見つかった一致の先頭からその文字列に一致する別の部分文字列を見つけることはできません。微妙な違いです。

これを書いているときに、誰かが数字だけを探すことを勧めているのを見ました。それもうまくいきますが、そこにあるのは数字だけであると確信している限り. あなたの目的が最も近い/との間にあるものを取得することである場合black、正規表現はそれを正確にターゲットにします。

于 2013-02-03T17:29:42.383 に答える