【问题标题】:Get string after a delimiter to the end of line获取分隔符后到行尾的字符串
【发布时间】:2013-07-27 04:04:16
【问题描述】:

我正在尝试使用 PHP 和 preg_match 在行尾的分隔符后获取一个字符串。这些是我的代码:

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

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

【问题讨论】:

  • 有人能解释一下(.*?) 中问号的语义吗?我知道? 的意思是“可选”,如{0,1}(xxx|),但我从未见过它在下面使用过*。它是否适用于.* 的整个表达式?如果是这样,那不是多余的吗,因为* 可以匹配 0 次出现?
  • @PeterAlfvin - ? 可以跟随任何量词以使该量词非贪婪。 (您可以查找该术语。)简而言之,它指示量词匹配尽可能少的实例(而不是尽可能多的实例,这是默认行为)。例如,*?+???{2,5}?,都是相应量词的非贪婪版本。
  • @acheong87 - 谢谢!

标签: php regex


【解决方案1】:

使用交替:

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

【讨论】:

  • 谢谢,在我使用这个版本之前使用 [\n|$] 而不是 (\n|$),我的错!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    原因是你需要在“We”之后换行才能正确匹配:

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

    【讨论】:

    • “我们”后面不是已经有\n,因为“EOT”出现在下一行?你是说正则表达式只有在最后有两个连续的\ns 时才有效?
    • 用于将 EOT 放在单独的行上的换行符不会进入字符串。
    • 啊,谢谢。我想这是有道理的,因为没有以其他方式结尾的行就无法终止字符串。
    【解决方案4】:

    您可以使用排除所有换行符的[^\n],而不是使用点:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多