我需要匹配所有这些开始标记:
<p>
<a href="foo">
Run Code Online (Sandbox Code Playgroud)
但不是这些:
<br />
<hr class="foo" />
Run Code Online (Sandbox Code Playgroud)
我想出了这个,并希望确保我做对了.我只抓住了a-z.
<([a-z]+) *[^/]*?>
Run Code Online (Sandbox Code Playgroud)
我相信它说:
/,然后我有这个权利吗?更重要的是,你怎么看?
我正在尝试<input>使用此模式匹配类型"隐藏"字段:
/<input type="hidden" name="([^"]*?)" value="([^"]*?)" />/
Run Code Online (Sandbox Code Playgroud)
这是示例表单数据:
<input type="hidden" name="SaveRequired" value="False" /><input type="hidden" name="__VIEWSTATE1" value="1H4sIAAtzrkX7QfL5VEGj6nGi+nP" /><input type="hidden" name="__VIEWSTATE2" value="0351118MK" /><input type="hidden" name="__VIEWSTATE3" value="ZVVV91yjY" /><input type="hidden" name="__VIEWSTATE0" value="3" /><input type="hidden" name="__VIEWSTATE" value="" /><input type="hidden" name="__VIEWSTATE" value="" />
Run Code Online (Sandbox Code Playgroud)
但我不知道的type,name和value属性将始终出现在相同的顺序.如果type属性是最后一个,则匹配将失败,因为在我的模式中,它在开始时.
问题:
如何更改模式以使其匹配,无论<input>标签中属性的位置如何?
PS:顺便说一下,我正在使用基于Adobe Air的RegEx桌面工具来测试正则表达式.
我正在使用托管的Linux机器,所以我没有权限写入/usr/lib目录.
当我尝试通过以下方式安装CPAN模块时:
perl Makefile.PL
make test
make install
Run Code Online (Sandbox Code Playgroud)
该模块被解压缩到一个blib/lib/文件夹.我保留了use
blib/lib/ModuleName但是编译器仍然无法找到模块.我已经尝试将.pm文件复制到本地目录并保留
require ModuleName但仍然给我一些错误.
如何将模块安装到其他目录并使用它?
我有一个类似模式的长htdoc,继续这样:
<td class="MODULE_PRODUCTS_CELL " align="center" valign="top" height="100">
<table width="100" summary="products"><tr>
<td align="center" height="75">
<a href="/collections.php?prod_id=50">
<img src="files/products_categories50_t.txt" border="0" alt="products" /></a><\br>
</td>
</tr>
<tr>
<td align="center">
<a href="/collections.php?prod_id=50"><strong>Buffer</strong><br />
</a>
<td>
</tr></table>
</td>
Run Code Online (Sandbox Code Playgroud)
在上面的html中我想提取:
collections.php?prod_id=50 files/products_categories50_t.txtBuffer我已经尝试过这段代码,
#!/usr/local/bin/perl
use strict;
use warnings;
my $filename = 'sr.txt';
open(FILENAME,$filename);
my @str = <FILENAME>;
chomp(@str);
#print "@str";
foreach my $str(@str){
if ($str =~/<td class(.*)<a href(.*?)><\/td>/) {
print "*****$2\n";
}
}
Run Code Online (Sandbox Code Playgroud)
此代码是试用版.然而,它只带来最后一次出现,而不是每次出现.为什么?
我知道你在想什么 - "噢,天哪,认真,不再" - 但请耐心等待,我的问题不仅仅是标题.在开始之前,我保证永远不会尝试用正则表达式解析任意HTML,或者问别人怎么做.
这里解释为什么你不能这样做的所有许多答案都依赖于正则表达式的正式定义.它们解析常规语言,HTML是无上下文但不是常规的,所以你不能这样做.但我也听说过各种语言的许多正则表达式实现都不是严格规范的; 他们带来了超出正式正则表达范围的额外技巧.
由于我不知道任何特定实现的细节,例如perl,我的问题是: