给出这样的字符串:
<a href="http://blah.com/foo/blah">This is the foo link</a>
Run Code Online (Sandbox Code Playgroud)
...和像"foo"这样的搜索字符串,我想强调HTML文本中出现的所有"foo" - 但不在标签内.换句话说,我想得到这个:
<a href="http://blah.com/foo/blah">This is the <b>foo</b> link</a>
Run Code Online (Sandbox Code Playgroud)
但是,简单的搜索和替换将不起作用,因为它将匹配<a>标记的href中的部分URL.
因此,要以问题的形式表达上述内容:如何限制正则表达式以使其仅匹配HTML标记之外的文本?
注意:我保证有问题的HTML永远不会像任何病态一样:
<img title="Haha! Here are some angle brackets to screw you up: ><" />
Run Code Online (Sandbox Code Playgroud)
编辑:是的,当然我知道CPAN中有复杂的库可以解析最令人发指的HTML,从而减少了对这种正则表达式的需求.在很多场合,这就是我会用的.但是,这不是其中之一,因为保持此脚本简短而没有外部依赖性非常重要.我只想要一行正则表达式.
编辑2:同样,我知道Template :: Refine :: Fragment可以解析我的所有HTML.如果我正在写一个应用程序我当然会使用这样的解决方案.但这不是一个应用程序.它只不过是一个shell脚本.这是一个一次性代码.在这种情况下,作为一个可以传递的单个自包含文件非常有价值."嘿,运行这个程序"是比一个简单得多的指令,"嘿,安装一个Perl模块,然后运行它 - 等等,什么,你以前从未使用过CPAN?好的,运行perl -MCPAN -e shell(最好作为根)然后它会问你一堆问题,但你真的不需要回答它们.不,不要害怕,这不会破坏任何东西.看,你不需要仔细回答每一个问题 - 只要一遍又一遍地进入.不,我保证,它不会破坏任何东西."
现在将上述内容扩展到大量用户,他们想知道为什么他们一直使用的简单脚本不再那么简单,当所有改变的是使搜索词变为粗体时.
因此,虽然Template :: Refine :: Fragment可能是其他人的HTML解析问题的答案,但这不是这个问题的答案.我只想要一个正则表达式,它适用于非常有限的HTML子集,实际上会要求脚本进行解析.
我想从Perl运行一个子命令(或将其传递给Perl脚本)并让脚本立即处理命令的输出,而不是等待超时,换行或一定数量的块.例如,假设我想用方括号包围每个输入块.当我像这样运行脚本时:
$ ( echo -n foo ; sleep 5 ; echo -n bar ; sleep 5; echo baz) | my_script.pl
Run Code Online (Sandbox Code Playgroud)
我希望输出是这样的,每一行出现在前一行之后五秒:
[foo]
[bar]
[baz]
Run Code Online (Sandbox Code Playgroud)
我怎么做?
这有效,但真的很难看:
#! /usr/bin/perl -w
use strict;
use Fcntl;
my $flags = '';
fcntl(STDIN, F_GETFL, $flags);
$flags |= O_NONBLOCK;
fcntl(STDIN, F_SETFL, $flags);
my $rin = '';
vec($rin,fileno(STDIN),1) = 1;
my $rout;
while (1) {
select($rout=$rin, undef, undef, undef);
last if eof();
my $buffer = '';
while (my $c = getc()) {
$buffer .= $c;
}
print …Run Code Online (Sandbox Code Playgroud) gnuplot文档有关于字体的说法:
Five basic fonts are supported directly by the gd library. These are
`tiny` (5x8 pixels), `small` (6x12 pixels), `medium`, (7x13 Bold),
`large` (8x16) or `giant` (9x15 pixels).
但是,当我尝试使用一个:
gnuplot> set terminal png font tiny
我明白了:
Could not find/open font when opening font tiny, using default
我如何使用这些看似内置的字体?
如何在Perl中获得原始套接字,然后构建与其一起使用的数据包的最佳方法是什么?
是否有一个快速的tcpdump单行程序打印出与特定子字符串匹配的TCP流 - 或者,如果这不容易,那么打印出与子字符串匹配的单个TCP 数据包怎么样?
比方说,我想写一个正则表达式来改变这一切<abc>,<def>和<ghi>标签为<xyz>标签..我也想改变自己的结束标记</xyz>.这似乎是一个合理的正则表达式(忽略反引号;如果我不包含它们,则StackOverflow会出现小于号的问题):
`s!<(/)?(abc|def|ghi)>!<${1}xyz>!g;`
Run Code Online (Sandbox Code Playgroud)
它也有效.唯一的问题是,对于打开标签,可选的$ 1变量被赋予undef,因此我得到一个"使用未初始化的值..."警告.
解决这个问题的优雅方法是什么?我宁愿不把它变成两个单独的正则表达式,一个用于打开标签,另一个用于关闭标签,因为那时需要维护两个标签列表副本,而不是一个.
编辑:我知道我可以在代码的这个区域关闭警告,但我不认为"优雅".