2017-07-24 80 views
-1

我试图从包含单个产品代码的网站上获取产品列表。 的产品代码是5位数字代码,这些元素其复杂程度从用正则表达式重复捕获组

<p>Part Number: 67001</p> 

<p>Part Number: 50545 &ndash; 450g Cartridge 50525 - 2.5kg Tub 50520 - 20kg Pail 50555 - 55kg Drum 50575 *Indent - 175kg Drum</p> 

不幸的是,5种模式在整个网页,所以我不能只用/\d{5}/

后我一个正则表达式,只提取零件号元素中的5位数字,而不是从网页的其余部分提取。

喜欢的东西:/\<p\>Part\s*Number\:\s*((\d{5}) repeat this capture group n times)\<\/p\>/

我知道我可以打破的页面向下阶段,并陆续将一个正则表达式做到这一点。例如

第一阶段/\<p\>Part\s*Number\:\s*.*?\<\/p\>/
第二阶段/\d{5}/

但有可能做到这一点在一个正则表达式模式,如果是的话怎么办?

回答

0

如果我理解正确你的问题,你就应该能够做到这一点:

Part\sNumber:\s(\d{5})

鉴于您的字符串包含所有Part Number,喜欢表现出如下:

<p>Part Number: 67001</p> 

<p>Part Number: 50545 &ndash; 450g Cartridge 50525 - 2.5kg Tub 50520 - 20kg Pail 50555 - 55kg Drum 50575 *Indent - 175kg Drum</p> 

<p>Part Number: 23425 - 55kg Drum 50575 *Indent - 175kg Drum</p> 

<p>Part Number: 52232</p> 
+0

没有,这正则表达式后才返回第一个代码{

型号:}我希望所有的代码之前结尾{

} – Kevin

+0

如果它是页面上唯一的5位数的代码,那么你可以使用'(\ d {5})'。 –

+0

不幸的是,5位数字模式遍及整个网页,所以我不能只用(\ d {5}) – Kevin

1

你AREN将无法提名未知数量的捕获组。

虽然有些程序员做逐大小写区别,所以一般不建议使用正则表达式来解析HTML。

How do you parse and process HTML/XML in PHP?

您选择所有你想要的<p>元素后,您可以使用我的模式/法提取符合条件的5位数字。我已经输入了几个“gotcha”子字符串来显示应该丢弃的内容。

方法:(Demo

$in='<p>Part Number: 67001</p> 

<p>Part Number 98765 - 10000kg capacity <- notice use of "kg" after the weight; disqualifies the substring</p> 

<p>Part Number 66666 - for more info, call 0455.86789 <- notice the dot before "86789" disqualifies substring (word boundary would have failed)</p> 

<p>Part Number: 50545 &ndash; 450g Cartridge 50525 - 2.5kg Tub 50520 - 20kg Pail 50555 - 55kg Drum 50575 *Indent - 175kg Drum</p>'; 

var_export(preg_match_all('/ \K\d{5}(?=)/',$in,$out)?$out[0]:'failed'); 

输出:

array (
    0 => '98765', 
    1 => '66666', 
    2 => '50545', 
    3 => '50525', 
    4 => '50520', 
    5 => '50555', 
    6 => '50575', 
) 

Pattern Demo

+0

我想你已经回答了我的问题。你的解决方案是一个改进。但是,如果存在未知数量的捕获组,并不总是可以在一个正则表达式中完成。两个阶段很容易实施。我会继续这样做。 – Kevin