2015-12-02 35 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