1

我得到了以下网址

http://www.amazon.com/LEGO-Ultimate-Building-Set-Pieces/dp/B000NO9GT4/ref=sr_1_1?m=ATVPDKIKX0DER&s=toys-and-games&ie=UTF8&qid=1350518571&sr=1-1&keywords=lego

我想提取

B000NO9GT4

那是asin ...到现在,我可以在字符串之间进行搜索,但不是我需要的这种方式。我看到了分裂函数,我看到了爆炸。但找不到出路...而且,网址的长度会有所不同,所以我不能硬编码长度为 2..在我看来唯一有意义的事情就是拆分字符串,以便

http://www.amazon.com/LEGO-Ultimate-Building-Set-Pieces/dp/

成为第一部分

B000NO9GT4/ref=sr_1_1?m=ATVPDKIKX0DER&s=toys-and-games&ie=UTF8&qid=1350518571&sr=1-1&keywords=lego

成为第二部分,从第二部分,我应该提取 B000NO9GT4

同样,我想LEGO-Ultimate-Building-Set-Pieces从第一部分获取产品名称

我在正则表达式方面非常糟糕,找不到出路..

有人可以指导我如何在 php 中做到这一点吗?

谢谢

4

2 回答 2

2

你可以试试

$str = "http://www.amazon.com/LEGO-Ultimate-Building-Set-Pieces/dp/B000NO9GT4/ref=sr_1_1?m=ATVPDKIKX0DER&s=toys-and-games&ie=UTF8&qid=1350518571&sr=1-1&keywords=lego" ;
list(,$desc,,$num,) = explode("/",parse_url($str,PHP_URL_PATH));
var_dump($desc,$num);

输出

string 'LEGO-Ultimate-Building-Set-Pieces' (length=33)
string 'B000NO9GT4' (length=10)
于 2012-10-18T00:30:07.803 回答
2

这会抓取您要捕获的两条信息:

$url = 'http://www.amazon.com/LEGO-Ultimate-Building-Set-Pieces/dp/B000NO9GT4/ref=sr_1_1?m=ATVPDKIKX0DER&s=toys-and-games&ie=UTF8&qid=1350518571&sr=1-1&keywords=lego';

$path = parse_url($url, PHP_URL_PATH);

if (preg_match('#^/([^/]+)/dp/([^/]+)/#i', $path, $matches)) {
    echo "Description = {$matches[1]}<br />"
        ."ASIN = {$matches[2]}<br />";
}

输出:

描述 = LEGO-Ultimate-Building-Set-Pieces
ASIN = B000NO9GT4

简短说明:

  • 包含在其中的任何表达式( )都将保存为捕获组。这就是我们获取 和 中数据的$matches[1]方式$matches[2]
  • 该表达式([^/]+)表示匹配除所有字符之外的所有字符/,因此实际上它捕获了 URL 中两个/分隔符之间的所有内容。我两次使用这种模式。[ ]实际定义了字符类/,在这种^情况下,它否定它,而不是匹配/它,而是匹配所有东西/。另一个例子是[a-f0-9]匹配字符a,b,c,d,e,f和数字0,1,2,3,4,5,6,7,8,9[^a-f0-9]会适得其反。
  • #用作表达式的分隔符
  • ^跟随分隔符意味着从字符串的开头匹配。

有关正则表达式如何工作的更多信息,请参阅www.regular-expressions.infoPCRE 模式语法

于 2012-10-18T00:33:04.377 回答