在 PHP 上使用正则表达式获取 HTML 页面 值和名称

2023-12-01

好的,正如标题所示,我有一个使用 libcurl(PHP 内的 cURL)获取的 HTML 页面。
该页面有一个

,我需要提取 名称和值,我想使用正则表达式来执行此操作。
我使用正则表达式来制作它,因为我认为这是更简单的方法。如果您认为我不应该使用正则表达式,而应该使用 xpath 之类的东西,请说明如何使用。

不知道你能不能明白我的意思,欢迎提问。

这是 PHP 代码(完整):

<?php



/***** DISABLED BY NETWORK TRAFFIC REASONS... USING LOCAL CACHE

$curl = curl_init();
$url = 'https://secure.optimus.pt/Particulares/Kanguru/Login/';
$useragent = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; pt-PT; rv:1.9.1) Gecko/20090624 Firefox/3.5';
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_USERAGENT,$useragent);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,true);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);
curl_setopt($curl,CURLOPT_CAINFO,getcwd()."\optimus_secure.crt");
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$contents = curl_exec($curl);
*/

$contents = file_get_contents('local_secure.html');
preg_match('%<form name="aspnetForm" .*? action="(.*?)" .*?>(.*?)</form>%s',$contents,$matches);
//echo '<pre>'.htmlentities($contents).'</pre>';
//array_shift($matches);
echo '<pre>---------';
foreach($matches as $match)
    echo '$match:::::: '.htmlentities($match)."\r\n\r\n";
echo '</pre>';

echo '<pre>__________';
preg_match_all('/<input type=".*?" name="(.*?)" value="(.*?)" \/>/', $matches[0], $matches2);
print_r($matches2);
echo '</pre>';

?>

当然,


 标签和所有输出仅用于调试。  

另外,这里是 HTML 页面的源代码(重要的部分):

<form name="aspnetForm" method="post" action="../Login?OptimusChannelID=D5774383-A407-42E9-A0AD-4838C97AB162&amp;OptimusContentID=&amp;OptimusSelectedSiteID=B33E7D52-8738-4756-A25D-B907D1823B71&amp;OptimusSelectedAreaID=AF8E0BDF-17E3-4438-9FA9-D53A13A508D8&amp;OptimusSelectedLocalID=D5774383-A407-42E9-A0AD-4838C97AB162" onsubmit="javascript:return WebForm_OnSubmit();" id="aspnetForm">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTc4MzE4NTQyNQ9kFgJmD2QWBgIID2QWAgIBD2QWBGYPZBYCAgMPDxYEHhRWYWxpZGF0aW9uRXhwcmVzc2lvbgUCLioeB0VuYWJsZWRoZGQCAQ9kFgICBQ8PFgIeBFRleHQFKk8gY2FtcG8gRW1haWwgJmVhY3V0ZTsgb2JyaWdhdCZvYWN1dGU7cmlvIWRkAgkPZBYCAgEPFgIfAmVkAgoPDxYCHgdWaXNpYmxlaGRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYCBSVjdGwwMCRNYWluQ29udGVudFBsYWNlSG9sZGVyJEltZ0xvZ2luBSxjdGwwMCRNYWluQ29udGVudFBsYWNlSG9sZGVyJGltZ0J0blJlY3VwZXJhcorZDETv8JCxlvTojv3w53/dbo9m" />
</div>
<script type="text/javascript">....</script>
<script src="..." type="text/javascript"></script>
<script src="..." type="text/javascript"></script>
<script type="text/javascript">...</script>
<div class="row_container">
<div class="titulo_barra rosa laranja_empresas">
LOGIN<br/>
</div>
<div class="PanelLogin">
<div class="Mensagem">
<div class="texto">
Para aceder, por favor, fa&ccedil;a login. 
</div>
</div>
<div id="ctl00_MainContentPlaceHolder_PanelLogin" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_MainContentPlaceHolder_ImgLogin')">
<div class="Mensagem">
<div>                           
<label for="telem">
User<span id="ctl00_MainContentPlaceHolder_UsernameValidator" style="color:Red;display:none;"></span>
</label>
<input name="ctl00$MainContentPlaceHolder$TxtUsername" type="text" id="ctl00_MainContentPlaceHolder_TxtUsername" class="text" maxlength="255" />
<label style="padding-left: 10px" for="password">
Password
<span id="ctl00_MainContentPlaceHolder_RequiredPasswordValidator" style="color:Red;display:none;"></span><span id="ctl00_MainContentPlaceHolder_UsernameRegexValidator" style="color:Red;display:none;"></span> </label>
<input name="ctl00$MainContentPlaceHolder$TxtPassword" type="password" id="ctl00_MainContentPlaceHolder_TxtPassword" class="text" maxlength="5" />
<input type="hidden" name="fromssl" value="" />
<input type="image" name="ctl00$MainContentPlaceHolder$ImgLogin" id="ctl00_MainContentPlaceHolder_ImgLogin" src="/img/btn_password.gif" alt="Login" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContentPlaceHolder$ImgLogin&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" style="border-width:0px;position: absolute; padding-left: 5px " /><br />                          
</div>
<div id="login_error_box">
<div id="ctl00_MainContentPlaceHolder_ValidationSummary1" class="error" style="color:#FF6000;display:none;">
</div>
</div>
</div>
</div>
</div>
<div class="titulo_barra rosa laranja_empresas">
RECUPERA&Ccedil;&Atilde;O DE PASSWORD
</div>
<div class="PanelLogin">
<div class="Mensagem">
<div class="texto">
Para recuperar a sua password introduza o seu e-mail. Se pretender recuperar o seu username utilize o link abaixo
</div>
</div>
<div id="ctl00_MainContentPlaceHolder_Panel1" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_MainContentPlaceHolder_imgBtnRecuperar')">
<div class="Mensagem">
<div id="Div1">
<label for="telem">
Email</label>
<input name="ctl00$MainContentPlaceHolder$txtEmailHabitual" type="text" id="ctl00_MainContentPlaceHolder_txtEmailHabitual" class="text" maxlength="255" />
<input type="image" name="ctl00$MainContentPlaceHolder$imgBtnRecuperar" id="ctl00_MainContentPlaceHolder_imgBtnRecuperar" class="img rosa azul_empresas" src="/img/bot_recuperar.gif" alt="Recuperar" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContentPlaceHolder$imgBtnRecuperar&quot;, &quot;&quot;, true, &quot;email&quot;, &quot;&quot;, false, false))" style="border-width:0px;margin-top: -2px; position: absolute;" />
<br />
<span id="ctl00_MainContentPlaceHolder_EmailValidator" class="error" style="color:Red;display:none;">O campo Email &eacute; obrigat&oacute;rio!</span>
<span id="ctl00_MainContentPlaceHolder_EmailRegularExpressionValidator" style="color:Red;display:none;"> Formato do Email inválido.</span>
</div> 
<div class="Mensagem" CssClass="error" DisplayMode="SingleParagraph" ForeColor="#FF6000">
</div>
<a id="ctl00_MainContentPlaceHolder_lnkRecuser" href="javascript:__doPostBack('ctl00$MainContentPlaceHolder$lnkRecuser','')">
<div align="left"  style="color:#FF7000" class="footerButtonsOrange">Recuperar username</div>
</a>
</div>
</div>
</div>
</div>
<script type="text/javascript">...</script>
<script type="text/javascript">...</script>
<script type="text/javascript">...</script>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBwKQ08lZAqmxyPwLAvCnm8wMAt/Wt8sGAv2svvMEAtCB5oUIAr6ar9wLz+9apOkY23Vs+vCYNJuK2ug3Gm0=" />
</div>
<script type="text/javascript">...</script>
</form>

另外,对于源代码的可读性较低,我们深表歉意。如果您愿意,我可以尝试更好地缩进。

谢谢你,
佩德罗·库尼亚

编辑:谢谢大家的帮助。所有的答案都完美地工作,但是我选择了 VolkerK 的响应,因为因为它是一个 HTML 页面,所以元素可能是嵌套的,并且我知道(在我对 XPath 的了解中) // 是一个通配符。


If you think I shouldn't use regex, but something like xpath, say how.
That would be something like
<?php
$doc = new DOMDocument;
if ( !$doc->loadhtml($contents) ) {
  echo 'something went wrong';
}
else {
  $xpath = new DOMXpath($doc);
  foreach($xpath->query('//form[@name="aspnetForm"]//input') as $eInput) {
      echo 'name=', $eInput->getAttribute('name'), ' value=', $eInput->getAttribute('value'), "\n";
  }
}

如果您收到烦人的警告消息,您可能需要使用 @$doc->loadhtml($contents);也许结合libxml_use_internal_errors() and libxml_get_errors()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP 上使用正则表达式获取 HTML 页面 值和名称 的相关文章

  • 如何使用正则表达式匹配模式的最后一次出现

    我有一个像这样的字符串 token1 token2 我要匹配 token2 使用正则表达式 它应该匹配的其他可能的情况是 token1 应该匹配 最后一个 token1 应该匹配 最后一个 token1 token2应该匹配 token2
  • Yii2 异常:ApcCache 需要加载 PHP apc 扩展

    在高级模板前端的主配置中配置缓存组件时 我收到异常 在我的 php ini 上启用了扩展 rsults 如何解决此问题 前端 config main php cache gt class gt yii caching ApcCache ke
  • 如何使用 Facebook SDK API 为页面/网址“点赞”?

    我正在使用这段代码 facebook gt api me likes post array url gt http www google com 我收到以下错误 Fatal error Uncaught OAuthException 200
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • 在 Symfony 序列化中更改序列化属性名称

    我正在使用 Symfony 序列化器 效果很好 use Symfony Component Serializer Annotation Groups Groups default notification public function g
  • 正则表达式 '?' 的类似物(前一项可选)在T-SQL中像什么?

    我想知道 是否可以翻译包含 的正则表达式 前面的项目可选 在 T SQL LIKE 模式中 DB 端无需任何操作 例如 31 4 我可以将其分成几个子句 但如果正则表达式包含很多 这不太方便 LIKE不使用正则表达式 并且它使用的模式语言没
  • 如何在 PHP 中使用 cURL 发出同时包含 GET 和 POST 参数的请求?

    其他人已经问过如何从 perl java bash 等执行此操作 但我需要在 PHP 中执行此操作 并且我没有看到任何已提出的专门与 PHP 相关的问题 或包含 PHP 的答案 My code ch curl init url curl s
  • PHP:读取字体文件的 TrueType/OpenType 元数据

    如何阅读字体详细信息 例如 字体在其元数据中包含版权 姓氏 设计者 版本等信息 我还希望脚本能够计算文件中的字形数量 并返回字体支持的语言 例如 典型的字体可能包含西方语言 瑞典语和罗马语言支持 并具有数百个字形 它应该支持 truetyp
  • PHP Solr PECL 扩展安装

    我已经使用命令安装了 pecl solr pecl install solr 和梨使用 wget http pear php net go pear phar php go pear phar 重启Apache后 我仍然收到错误 Fatal
  • 使用 XSLT 将 XML 转换为 SQL

    由于我无法控制的原因 我将获得一个 XML 文件和一个 XSLT 文件 该文件可以将 XML 文件转换为 SQL 代码或错误 现在让我们假设我们可以信任提供 XML 文件的人不会在 XML 中包含危险的构造 我什至不知道是否应该使用 Sim
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • phpunit测试调用其他需要mock的类方法的方法

    我正在尝试创建一个非常标准的单元测试 在其中调用一个方法并断言它的响应 但是我正在测试的方法调用同一类中的另一个方法 该方法做了一些繁重的工作 我想模拟该方法 但仍按原样执行我正在测试的方法 仅使用从调用另一种方法返回的模拟值 我简化了示例
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • 从数据库填充复选框

    我有两个表 第一个由与名称关联的 id 组成 1 汽车 2 火车 3 普通 ETC 第二个表由两个字段 user id 和第一个表中的 id 组成 例如 1 1 2 1 3 当用户转到该页面时 我试图重新填充选定的复选框 首先 您查询数据库
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2

随机推荐

  • JavaMail base64 编码

    我有一些 Java 代码 它会发送一封电子邮件 代码如下 MimeBodyPart part new MimeBodyPart part setContent htmlString text html charset UTF 8 part
  • 如何解决 Rails 插件上的 rake 任务弃用问题?

    由于引入的概念here Rails Plugin 只不过是一个 Rails Engine 但由于它已加载 在启动过程中为时已晚 它确实 不具有相同的配置权力 作为一个裸露的 Rails Engine 与 Rails Railtie 相对并且
  • NestJS/TypeORM:无法设置只有 getter 的 # 的属性元数据

    我尝试运行我的 Nestjstutorial 应用程序 显示以下错误 我的后端连接到 PostgreSQL 数据库 TypeError 无法设置只有 getter 的 属性元数据 在 EntityManager getCustomRepos
  • 使用代码默认值对集合属性进行 XML 反序列化

    对于应用程序配置 我经常会创建一个配置类 其中包含应用程序的配置值 然后将其反序列化为要使用的对象 配置对象通常与用户界面控件进行数据绑定 以便用户可以更改和保留配置 配置类通常具有分配给属性的默认值 以便始终存在默认配置 这效果很好 我最
  • Prolog - 将列表的偶数元素乘以数字 (F)

    我正在 Prolog 中编程 从任何给定的数字 F 开始 将列表中的偶数元素相乘 保留那些不是的值 开发了以下内容 实际上程序 编译 没有任何错误 但在输入值时它只返回 false 我哪里可能错了 base case evenproduct
  • 禁用 Pygame 控制台输出 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在Python中抑制控制台输出 目前我正在使用 pygame 读取操纵杆输入 我需要解决以下问题 当调用操纵杆模块中的函数时 例如get axis or get button 该函数打印出诸如SD
  • ListView 项目的原始坐标

    我有以下问题 在我的布局上 我有一个操作栏 例如 高度为 150dp 其余的是 ListView 我可以从操作栏中获取一些视图并将其拖动到列表视图上 拖动是通过windowsmanager实现的 所以当拖动时我得到原始Y坐标 现在 我想将
  • 在Python中证明傅里叶变换运算

    我有一个时域表达式 f 1j H t exp 1j a b t 可以使用解析傅立叶变换已知属性 H是亥维赛阶跃函数 该 FT 运算的结果是 F w a 1j b w a 2 b 2 where w是频率 现在我正在使用中的提示本文进行数值傅
  • iPhone Codesign 目标文件格式无效或不合适

    我不小心删除了 xcode 中的目标 所以我创建了一个具有完全相同名称的新项目 在目标设置中 我再次选择了正确的代码签名身份 但现在我无法再为该设备进行编译了 一旦我想构建 我就会得到 CodeSign build Release ipho
  • 我可以使用 ADO.Net 实体框架延迟加载标量属性吗?

    我有一个数据库表Image有一根巨大的柱子 Data 我宁愿延迟加载这一列 这样当我获得所有图像的列表时 我就不会查询所有内容 我知道我可以将数据放入其自己的列和实体中 如下所示 但是 我必须这样做吗 是的 我相信你确实必须这样做 我认为
  • 适用于 Excel 2007 和 2010 的 Excel 插件

    我正在编写一个可以在 2007 和 2010 中运行的 Excel 插件 当我使用 Visual Studio 创建新项目时 我需要决定我想要哪个版本 我之前选择了2007 但由于我安装了2010 所以无法调试它 我收到错误 您无法调试或运
  • 使用 JGit 与上次提交进行文件比较

    我正在尝试使用 JGit 来获取文件从上次提交到最近未提交更改的差异 我怎样才能用 JGit 做到这一点 使用命令行的输出是git diff HEAD 经过多次讨论 link1 link2 我附带了一段代码 能够找到未提交的文件 但我无法得
  • 在c#中添加progressBar来查看进程的进度百分比

    这是关于我的流程的代码 StreamReader outputReader null StreamReader errorReader null ProcessStartInfo processStartInfo new ProcessSt
  • Bower安装EACCESS错误

    我尝试从 Bower json bower install 安装依赖项时遇到此错误 但我不知道它是什么或如何修复它 任何帮助将不胜感激 deniz946 UbuntuOS Desktop meanapp client resourcejs
  • Spring boot - 使用动态 TTL 周期驱逐缓存

    从我的微服务 SERVICE A 中 我对另一个微服务 SERVICE B 进行了其余 api 调用以进行登录并获取访问令牌 该 API 将使用该令牌的 TTL 进行响应 我需要缓存令牌 直到 SERVICE B 响应的 TTL 秒 为止
  • XML 解析难题

    更新 我重新设计了这个问题 以显示我所取得的进展 也许可以更容易回答 更新 2 我已向 XML 添加了另一个值 每个 zip 中都提供扩展 每个项目可以有多个由选项卡分隔的项目 所以它的结构将是这样的 平台 gt 分机 子组 gt 名称 g
  • 在android中实现pdf.js从sd卡读取

    我正在尝试为我的 Android 应用程序实现一个 pdf 查看器 它显示 SD 卡中存在的不同 pdf 文件 我正在考虑使用 pdf js 库 我使用了此处发布的代码示例 https bitbucket org butelo pdfvie
  • 在嵌套组件孙子组件和根组件之间发出事件

    I have wheels component嵌套到car component 轮子 组件 export class WheelsComponent Output onLoaded EventEmitter
  • 将参数作为 const 引用与普通引用传递[重复]

    这个问题在这里已经有答案了 可能的重复 为什么非常量引用不能绑定到临时对象 有这样的代码 void fun ref int par void fun const ref const int par int main fun ref 2 er
  • 在 PHP 上使用正则表达式获取 HTML 页面 值和名称

    好的 正如标题所示 我有一个使用 libcurl PHP 内的 cURL 获取的 HTML 页面 该页面有一个 我需要提取 名称和值 我想使用正则表达式来执行此操作 我使用正则表达式来制作它 因为我认为这是更简单的方法 如果您认为我不应该使