正则表达式:行开头的表达式OR NOT

时间:2014-03-16 14:19:19

标签: php regex

我试图在PHP中使用一些正则表达式,但有一点我不明白。 这是我的文字:

# fhzmvbzmvbzmb#@!
# blabla
# test
sbsfzzbg

让我们说我想强调它在降价时。为什么以下功能仅适用于我的第二行?我希望它也适用于第三行。

preg_replace("/\n(.*)\n/", "<h1>$1</h1>", $input_lines);

另外,我想赶上第一行。有没有办法写我想要捕获的表达式可能是在字符串的开头还是没有?我已经考虑过下一个功能,但它似乎不起作用:

preg_replace("/(^|\n)(.*)\n/", "<h1>$1</h1>", $input_lines);

非常感谢你。 皮埃里克

2 个答案:

答案 0 :(得分:2)

使用m修饰符,您可以将^$应用于每一行:

http://www.phpliveregex.com/p/4eb

来自文档:

  

默认情况下,PCRE将主题字符串视为由单个“行”字符组成(即使它实际上包含多个换行符)。 “行首”元字符(^)仅匹配字符串的开头,而“行尾”元字符($)仅匹配字符串的结尾或终止换行符之前(除非设置了D修饰符) )。这与Perl相同。设置此修饰符时,“行首”和“行尾”构造分别在主题字符串中的任何换行符之后或之前立即匹配,以及在开头和结尾处匹配。这相当于Perl的/ m修饰符。如果主题字符串中没有“\ n”字符,或者模式中没有出现^或$,则设置此修饰符无效。

答案 1 :(得分:0)

要进行替换,你可以使用lookaheads和lookbehinds来做这样的事情以匹配换行符。我不确定如何在你用来替换的同一个表达式中捕获第一行。这就是我想出的:

$input_lines = '# fhzmvbzmvbzmb#@!
# blabla
# test
sbsfzzbg';

// REPLACE
$data = preg_replace("/(?<=\n)(.*)(?=\n)/m", "<h1>$1</h1>", $input_lines);
print $data;

// GET THE FIRST LINE
preg_match('/^(.*)\n/', $input_lines, $first_line_matches);

print "\n\nFirst Line: ".$first_line_matches[1];

这输出以下内容:

# fhzmvbzmvbzmb#@!
<h1># blabla
</h1>
<h1># test
</h1>
sbsfzzbg

First Line: # fhzmvbzmvbzmb#@!