Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取分隔符后的字符串到行尾_Php_Regex - Fatal编程技术网

Php 获取分隔符后的字符串到行尾

Php 获取分隔符后的字符串到行尾,php,regex,Php,Regex,我试图用PHP和preg_match在一个分隔符之后获取一个字符串,直到行的末尾。这是我的密码: <?php $stringa = <<<EOT var1=Ciao var2=Variabile var3=We EOT; preg_match("#var2=(.*?)\n#", $stringa, $boh); print_r($boh); ?> 这是可行的,但不是最后一行,如果我在正则表达式中将var2替换为var3,生成的数组将为空。使用替换: #var2

我试图用PHP和preg_match在一个分隔符之后获取一个字符串,直到行的末尾。这是我的密码:

<?php
$stringa = <<<EOT
var1=Ciao
var2=Variabile
var3=We
EOT;
preg_match("#var2=(.*?)\n#", $stringa, $boh);
print_r($boh);
?>

这是可行的,但不是最后一行,如果我在正则表达式中将var2替换为var3,生成的数组将为空。

使用替换:

#var2=(.*?)(\n|$)#
           ^  ^^^

原因是您需要在“We”后面加一个换行符才能正确匹配:

<?php
$stringa = <<<EOT
var1=Ciao
var2=Variabile
var3=We

EOT;
preg_match("#var3=(.*?)\n#", $stringa, $boh);
print_r($boh);
?>

使用多行模式,即
m
修饰符,以便
$
匹配换行符或字符串结尾:

preg_match('#var2=(.*?)$#m', $stringa, $boh);

您可以使用排除所有换行符的
[^\n]
来代替点:

preg_match('~(?<=var3=)[^\n]+~', $stringa, $boh);

preg\u match(“~”?在“We”之后不是已经有了一个
\n
,因为“EOT”出现在下一行?你是说正则表达式只有在结尾有两个连续的
\n
时才有效吗?用于将EOT放在单独一行上的换行符不能放入字符串中。啊,谢谢。我想这是有意义的,因为如果没有其他行结尾,就无法终止字符串。有人能解释一下吗n在
(.*)
中问号的语义我知道
表示“可选”,如
{0,1}
(xxx |)
,但我从未见过它在
*
后面使用。它是否适用于
*
的整个表达式?如果是,它不是多余的,因为
*
可以匹配0个实例?@PeterAlfvin-
可以跟随任何量词,使该量词不贪婪。(您可以查找该术语。)简而言之,它指示量词匹配尽可能少的实例(而不是尽可能多的实例,这是默认行为)。例如,
*?
+?
??
{2,5}?
,都是相应量词的非贪婪版本。@acheong87-谢谢!谢谢,在我使用此版本之前,使用[\n |$]而不是(\n |$),我的坏!