在php中提取两个单词之间的文本

时间:2012-10-18 00:27:19

标签: php regex string split

我收到了以下网址

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 ...到现在为止,我可以在字符串之间进行搜索,但不是这样我需要的。我看到了分裂的功能,我看到了爆炸。但是找不到出路......而且,网址的长度会有所不同,所以我不能对长度进行硬编码。在我看来,唯一有意义的就是分割字符串以便

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中完成它吗?

感谢

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 Pattern Syntax