正则表达式从网页上获取某个子字符串?

时间:2015-12-02 17:53:14

标签: php regex

我正在抓一个网站并得到这个:

<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 个答案:

答案 0 :(得分:1)

以下是访问具有nameGEO_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)来完成这些任务几乎总是更好。