2012-06-30 175 views
1

我需要找到一个文本块中的2个标签,并保持它们之间的任何文本。如何提取2个标签之间的文字在php

例如,如果在“开始”标签是-----start-----和“结束”的标签是-----end-----

鉴于这样的文字:

rtyfbytgyuibg-----start-----isnv4b987b6vdc5y6ughnjmn9b8v76ctyubinn98b76r 
-----end-----gcgkhjkn 

我需要只保留2个标签之间的文本:isnv4b987b6vdc5y6ughnjmn9b8v76ctyubinn98b76r

有没有想法?谢谢。

+0

喜燕..我没试过什么,因为我不知道什么PHP函数可以做到这一点..但现在即时通讯使用的preg_match – john

回答

12

这里有几种方法:

$lump = 'rtyfbytgyuibg-----start-----isnv4b987b6vdc5y6ughnjmn9b8v76ctyubinn98b76r-----end-----gcgkhjkn'; 
$start_tag = '-----start-----'; 
$end_tag = '-----end-----'; 

// method 1 
if (preg_match('/'.preg_quote($start_tag).'(.*?)'.preg_quote($end_tag).'/s', $lump, $matches)) { 
    echo $matches[1]; 
} 

// method 2 (faster) 
$startpos = strpos($lump, $start_tag) + strlen($start_tag); 
if ($startpos !== false) { 
    $endpos = strpos($lump, $end_tag, $startpos); 
    if ($endpos !== false) { 
     echo substr($lump, $startpos, $endpos - $startpos); 
    } 
} 

// method 3 (if you need to find multiple occurrences) 
if (preg_match_all('/'.preg_quote($start_tag).'(.*?)'.preg_quote($end_tag).'/s', $lump, $matches)) { 
    print_r($matches[1]); 
} 
+0

嗨马克,感谢这些3即时通讯使用函数getTextBetweenTags($ string) { $ pattern =“/ ----- BEGIN PKCS7 -----(。*?)----- END PKCS7 ----- /“; preg_match($ pattern,$ string,$ matches); return $ matches [1]; } $ txt = getTextBetweenTags($ mytext); – john

+0

不客气。我会很有兴趣知道你选择了哪3个.... –

+0

请参阅我对方法#2的更正以检查是否找到了结束标记。 –

7

试试这个:

$start = '-----start-----'; 
$end = '-----end-----'; 
$string = 'rtyfbytgyuibg-----start-----isnv4b987b6vdc5y6ughnjmn9b8v76ctyubinn98b76r-----end-----gcgkhjkn'; 
$output = strstr(substr($string, strpos($string, $start) + strlen($start)), $end, true); 
echo $output; 

will print

isnv4b987b6vdc5y6ughnjmn9b8v76ctyubinn98b76r 
+0

你会不会有'strlen的补偿($开始),而不是' 'substr'的​​第二个参数中的'+ 1'? –

+0

substr()的参数是$ string,$ start,$ length –

+0

感谢评论家伙 - 只是测试它,它现在应该工作 – nickb

0

如果您的字符串实际上是HTML数据,你必须添加htmlentities($ lump)所以它不会返回空:

$lump = '<html><head></head><body>rtyfbytgyuibg-----start-----<div>isnv4b987b6vdc5y6ughnjmn9b8v76ctyubinn98b76r</div>-----end-----gcgkhjkn</body></html>'; 
$lump = htmlentities($lump) //<-- HERE 
$start_tag = '-----start-----'; 
$end_tag = '-----end-----'; 

// method 1 
if (preg_match('/'.preg_quote($start_tag).'(.*?)'.preg_quote($end_tag).'/s', $lump, $matches)) { 
     echo $matches[1]; 
} 

// method 2 (faster) 
$startpos = strpos($lump, $start_tag) + strlen($start_tag); 
if ($startpos !== false) { 
    $endpos = strpos($lump, $end_tag, $startpos); 
     if ($endpos !== false) { 
      echo substr($lump, $startpos, $endpos - $startpos); 
     } 
} 

// method 3 (if you need to find multiple occurrences) 
if (preg_match_all('/'.preg_quote($start_tag).'(.*?)'.preg_quote($end_tag).'/s', $lump, $matches)) { 
     print_r($matches[1]); 
} 

// method 4 
$output = strstr(substr($string, strpos($string, $start) + strlen($start)), $end, true); 

//Turn back to regular HTML 
echo htmlspecialchars_decode($output); 
相关问题