在字符串中
<td class="useragent"><a href="/useragents/parse/627832-chrome-windows-blink">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36</a></td>
我正在尝试提取并复制到剪贴板
Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 60.0.3112.113 Safari / 537.36
使用位于https://regexr.com/的正则表达式测试器,我发现此正则表达式可以实现我所寻求的功能:
(?<=<td class="useragent"><a href=".*">).*(?=</a>)
当我在Sublime Text中尝试时,它没有。我猜想这与RegEx的不同“风味”有关,那么如何更改此RegEx以与Sublime Text一起使用?
您不能在PCRE正则表达式中使用未知长度的后视(这是Sublime Text 3中使用的正则表达式库)。但是,由于使用的是正向后视,因此您可以改用\K
match reset运算符(它将丢弃所有与匹配存储器缓冲区相匹配的文本)。
另外,您可以考虑一些增强功能:
".*"
可能会跨标签溢出,请"[^"]*"
改用.*</a>
可能到达</a>
一行的最后一个,用于.*?</a>
到达第一个<a>
节点中有换行符,请使用(?s)
DOTALL内联修饰符跨行进行.*?
匹配使用
(?s)<td class="useragent"><a href="[^"]*">\K.*?(?=</a>)
^^
请参阅regex演示。
ST3测试:
请参阅regular-expressions.info ,在总体正则表达式匹配中保持文本与当前匹配。
实际上,您应该谨慎地从任意HTML解析数据。如果要从大型HTML获取所需的所有文本,则应考虑使用成熟的HTML DOM支持技术。这是一个使用PHP的示例(请参见在线PHP演示):
$text = <<<EOD
<td class="useragent"><a href="/useragents/parse/627832-chrome-windows-blink">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36</a></td>
EOD;
$domDocument = new DOMDocument;
$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($domDocument);
$nodes = $xpath->query('//td[@class="useragent"]/a');
$res = [];
foreach($nodes as $txt) {
array_push($res, $txt->textContent);
}
print_r($res);
结果:
Array
(
[0] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
)
在这里,$text
是你的HTML文本,//td[@class="useragent"]/a
是一个XPath是获取所有td
其节点class
的属性值等于useragent
,然后抓住a
它们内部节点。实际文本用返回$txt->textContent
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句