2016-04-08 64 views
0

我有一个包含这些数据的TXT文件:无法的preg_match标记内容​​

<!-- block_Inspekcionnye_proverki1000_1 -->some arbitrary data 
<!-- end_block_Inspekcionnye_proverki1000_1 --> other data and other tags 

然而,当我试图将此内容与正则表达式匹配,我什么也没有 - 只是一个空数组。这是我有:

$regex = "`<!-- block_Inspekcionnye_proverki1000_1 -->(.*)<!-- end_block_Inspekcionnye_proverki1000_1 -->`"; 
$text = file_get_contents("txt.txt"); 
preg_match($regex, $text, $matches); 
echo strpos($text, "<!-- block_Inspekcionnye_proverki1000_1 -->") . "<BR/>"; 
echo strpos($text, "<!-- end_block_Inspekcionnye_proverki1000_1 -->") . "<BR/>"; 
print_r($matches); 

结果我得到:

1178 
59172 
Array () 

所以,你可以看到的确有<!-- block_Inspekcionnye_proverki1000_1 -->标签 - 它开始于指数1178。结尾标记<!-- end_block_Inspekcionnye_proverki1000_1 -->开始于索引59172。但为什么$matches是空的?如果我做错了什么,使用preg_match获得标签及其内容的正确方法是什么?

+0

这是由于'\这个'((。| \\ n)*)'而不是'(。*)'.. 在这里检查: - https://regex101.com/r/kB5vC2/1 – rock321987

+0

你可以使用'backreference'如下所示: - 简单的http://ideone.com/1ivkFI – rock321987

+2

@ rock321987解决方案的替代方案是在你的正则表达式中包含's'模式修饰符,如下所示:'$ regex =“\'<! - block_Inspekcionnye_proverki1000_1 - >(。*)<! - end_block_Inspekcionnye_proverki1000_1 - > \“s”;'。这将使点也匹配换行符。 –

回答

1

使用正则表达式正向后看?<=)和正先行溶液(?=)断言

$str = "<!-- block_Inspekcionnye_proverki1000_1 -->some arbitrary data 
<!-- end_block_Inspekcionnye_proverki1000_1 --> other data and other tag"; 

preg_match("/(?<=-->)[\w ]+?\R?(?=<!--)/su", $str, $matches); 

print_r($matches); 

输出:

Array 
(
    [0] => some arbitrary data 

) 
+0

给出的'flags'伟大的解决方案!谢谢! – Jacobian

+0

@Jacobian,不客气 – RomanPerekhrest