我正在抓一个网站并得到这个:
<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 '/'
答案 0 :(得分:1)
以下是访问具有name
值GEO_FOOTPRINT
属性的唯一元素的方法:
$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
)之外(以便我们不会跨越另一个查询参数)。
可以有其他regexp(您可以在模式的开头添加OpenModalDialog\(\'http\S*?
来限制它),或者尝试字符串split / substr函数等。
请参阅IDEONE demo
答案 1 :(得分: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)来完成这些任务几乎总是更好。