2015-12-02 36 views
0

我刮一个网站,并得到这个:正则表达式从网页刮取某个子字符串?

<input type="BUTTON" value="Geographic Footprint" name="GEO_FOOTPRINT" onclick="return OpenModalDialog('https://mspfast.elavon.com/Symphony/client/client.do?uid=0XrHleUX5MudUYVwwsGDYCl&novaid=5418812&readonly=Y&context=BOARDING&defaultRoute=GeographicFootprint')"> 

我想是刚刚抢UID:0XrHleUX5MudUYVwwsGDYCl

我很新的正则表达式和并不真正了解它是如何工作的。

我试着这样做:

'/value="Geographic Footprint" name="GEO_FOOTPRINT" onclick="return OpenModalDialog(\'https://mspfast.elavon.com/Symphony/client/client.do?uid=([a-zA-Z0-9]+)\&/' 

为正则表达式,但它不工作。我得到的unknown modifier '/'

+2

“我对于正则表达式很陌生,并不真正理解它是如何工作的”,但是您正在尝试使用它来代替使用HTMl解析器? – PeeHaa

+1

@PeeHaa如果有人不熟悉正则表达式,你认为他们会知道何时使用它或HTML解析器(他们毫无疑问不熟悉)? –

+2

你忘了逃避URL中的'/'......你应该在尝试使用它们同时解析html **和** javascript之前,更多地学习正则表达式。 –

回答

0

下面是一个例子一组命名:

$str = "<input type=\"BUTTON\" value=\"Geographic Footprint\" name=\"GEO_FOOTPRINT\" onclick=\"return OpenModalDialog('https://mspfast.elavon.com/Symphony/client/client.do?uid=0XrHleUX5MudUYVwwsGDYCl&novaid=5418812&readonly=Y&context=BOARDING&defaultRoute=GeographicFootprint')\">"; 
$regex = '/uid=(?P<uid>[^&]+)/'; 
// search for uid literally, afterwards match everything except an ampersand 
// and capture it in a group called "uid" 

preg_match_all($regex, $str, $matches); 
$uid = $matches["uid"][0]; 
// uid: 0XrHleUX5MudUYVwwsGDYCl 

虽然这可能会为这个特殊的例子工作,这几乎是永诺更好地使用解析器(如SimpleXML的)这些任务。

1

在这里的错误是一种以具有GEO_FOOTPRINTname属性来访问的唯一元素的方式:

$html = '<body><input type="BUTTON" value="Geographic Footprint" name="GEO_FOOTPRINT" onclick="return OpenModalDialog(\'https://mspfast.elavon.com/Symphony/client/client.do?uid=0XrHleUX5MudUYVwwsGDYCl&novaid=5418812&readonly=Y&context=BOARDING&defaultRoute=GeographicFootprint\')"></body>'; 
libxml_use_internal_errors(true); 
$dom = new DOMDocument('1.0', 'UTF-8'); 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DOMXPath($dom); 
$link = $xpath->query('//input[@name="GEO_FOOTPRINT"]')->item(0); 
$val = $link->getAttribute('onclick'); 

现在,一旦我们有onclick属性值的文本,我们可以考虑几个获取uid值的方法。这里是一个正则表达式之一:

preg_match('~[?&]uid=([^&\s]+)~', $val, $m); 
echo $m[1]; 

[?&]uid=([^&\s]+)匹配?&,然后uid序列,然后=,然后匹配并捕捉到第1个的一个或多个字符比&或空白(\s)其它(这样的正则表达式我们不跨越另一个查询参数)。

可以存在其它正则表达式(可能在模式的开始处添加OpenModalDialog\(\'http\S*?限制的话),或者尝试串分流/ SUBSTR功能等

参见IDEONE demo