2014-07-05 81 views
0

我已经按照我的一段串多的时间,我想表明我的网页上结束正则表达式找到一个子字符串开头,以特定的词

START_num_360_250_END

这里num可以是任何数量的任何数字,这个字符串可以在段落中的任何地方和任何次数。并且num可以在该字符串中重复(即重复的字符串)。我一次只需要这些字符串。

我在做以下事情。

for($i=1;$i<=$file_count;$i++){ 
    preg_match('/START_'.$i.'(.*)_END/', $p_info['blog_content'], $match); 
    print_r($match); 
} 

例如,如果我有一个串在我的第二段时间如下 START_1_360_250_ENDSTART_2_360_250_END

我应该得到START_1_360_250_END为第一次重复中for loop(如num这里是1),即使该字符串出现任何数量的时候,我应该只得到它一旦。第二次迭代的START_2_360_250_ENDnum这里是2

但这就是我得到的。

Array ( 
    [0] => START_1_360_250_END<p><br></p><p>START_2_360_250_END 
    [1] => _360_250_END<p><br></p><p>START_2_360_250 
) 
Array ([0] => START_2_360_250_END [1] => _360_250) 
Array () 
Array () 
Array () 
Array () 
Array () 
Array () 
Array () 
+0

* for循环?正则表达式可怜!* – revo

回答

0

您使用了贪心匹配(.*),这将始终尝试尽可能多的字符匹配越好(导致匹配企业跨越式两个条目)。

只是使它非贪婪的匹配(.*?)。这将尝试匹配尽可能少的字符。

如果您想使其更强劲,更具体的类象\w,这将匹配字母数字字符以及_(这应该是最适合你的情况)更换.

+0

我更新了我的代码,它给我下面的数组现在 阵列( [0] => START_1_360_250_END'[1] => _360_250') 阵列( [0] => START_2_360_250_END'[1] = ()Array()Array()Array()Array()Array() 为什么我会得到上面突出显示的字符串? –

+0

这就是表达式应该匹配的。您没有在第一个数字后面指定下划线,所以下划线将在括号/捕捉组内匹配。如果您不想要前导下划线,请将其添加到外部,即将''(。*?)_ END /''更改为'_(。*?)_ END /''。如果您不需要额外的捕获组,则可以将其删除。贪婪/不贪婪的匹配会很好:'_。*?_ END /'' – Mario

相关问题