如何在php正则表达式中逐行匹配字符串?

时间:2015-12-11 06:35:06

标签: php regex preg-match

我有多个换行符的字符串,每个新行都包含一个新的子字符串。

以下是包含2行的字符串示例:

 $x="Hello
       World!

您可以看到 Hello 位于第一行, World!位于换行符中。

每个子串在有或没有换行符的情况下开始和结束。

我想匹配两条线。

我的currunt代码匹配第二行并忽略了第一行。

 if(preg_match_all("/^\n*\s*(Hello|World!)\s*$/i",$x,$m))

 {print_r($m);}

有没有办法解决这个问题,以便两条线都匹配?

3 个答案:

答案 0 :(得分:1)

if(preg_match_all("/(Hello|World!)/i",$x,$m))
{
 print_r($m);
}

如果您使用^ $,则仅匹配整行。 所以Hello部分在Hello之前没有\ n * \ s *,所以它不会匹配。 如果您更改上面的脚本,它只会查找单词,不管在单词之前或之后有任何内容。

希望有所帮助。

答案 1 :(得分:1)

试试这个

auto pos = stng.find("1"); // search for 1 in the string
if (pos!=stng.npos)  // check if 1 is found
{
   stng.replace(pos, 1, ":x:");   // replace ":x:" starting from 'pos' to 'pos+1'
}

<强>输出

 $x="Hello    
 world! ";

preg_match_all("#\b(Hello|World!)\b#",$x,$m) ;

echo count($m)

Phpfiddle Preview

答案 2 :(得分:1)

我不确定&#34;目标&#34;但这个正则表达式将匹配两条线。我将Hello | World更改为(。+?),因为它匹配任何字符,因此如果要解析代码,则会匹配变量。

/^(.+?)[\n,\s,\t]{1,8}(.+?)$/

以下是您使用新正则表达式的示例,因此,如果我误解了您可以看到正在发生的事情。

<?php 

 $x="Hello
      World!";

 if(preg_match_all("/^(.+?)[\n,\s,\t]{1,8}(.+?)$/i",$x,$m))

 {print_r($m);}

?>

如果解析多个系列,你需要确定第一行和第二行之间的潜在字符数和数量,然后修改{1,8}以适应空格,制表符,换行符,等...