2011-05-18 55 views
2

我在寫php功能來搜索某個php文件中的某個文本時遇到了問題。我對正則表達式不擅長,所以我認爲這是問題所在。在開始和結束的php文件中搜索字符串

我需要正則表達式有一個開始詞和結束詞,並應返回在中間找到的文本。 這是我的嘗試:

$handle1 = fopen($file, "r"); 
$fileContents = fread($handle1,filesize($file)); 
if (preg_match('/'.$start. '((.|\n)*)'. $end.'/', $fileContents, $match)) { 
$text=preg_split('/'.$start.'((.|\n)*)'. $end.'/', $match[0]); 
echo $text. " found in $file<br/>"; 
} 

任何人可以幫助嗎?

+1

你能給一個樣本輸入的例子,你期望的結果是什麼? – 2011-05-18 13:43:10

+0

作爲一個方面的評論,我的猜測是你想要儘可能小的比賽。如果是這樣,你需要使匹配非貪婪:'(。| \ n)*?'。另外,請注意可能包含正則表達式特殊字符的'$ start'和'$ end'字符串。 – krookedking 2011-05-18 13:43:54

+0

你會得到什麼錯誤? – Femi 2011-05-18 13:45:51

回答

6
<?php 
$str = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ...'; 

$start = 'sadipscing'; 
$end = 'dolore'; 

$pattern = sprintf(
    '/%s(.+?)%s/ims', 
    preg_quote($start, '/'), preg_quote($end, '/') 
); 

if (preg_match($pattern, $str, $matches)) { 
    list(, $match) = $matches; 
    echo $match; 
} 

其中$str應該是您的文件的內容。

看一看:http://www.php.net/manual/en/reference.pcre.pattern.modifiers.phpi,ms修飾符。

+0

將工作,如果字符串有新行? – Songo 2011-05-18 15:42:14

+0

@Songo現在它會。見's'修飾符。 (答案的最後一行) – Yoshi 2011-05-18 15:45:18

6

你不需要這個正則表達式。

function getText($string, $start, $end) 
{ 
    $text = ""; 
    $posStart = strrpos($string, $start); 
    $posEnd = strrpos($string, $end, $posStart); 
    if($posStart > 0 && $posEnd > 0) 
    { 
     $text = substr($string, $posStart, strlen($string) - $posEnd)); 
    } 
    return $text; 
} 

希望這會有所幫助。

+0

將工作,如果字符串有新行? – Songo 2011-05-18 15:42:45

1

我喜歡這兩種解決方案

function GetBetween($content,$start,$end) 
{ 
    $r = explode($start, $content); 
    if (isset($r[1])){ 
     $r = explode($end, $r[1]); 
     return $r[0]; 
    } 
    return ''; 
} 


function get_string_between($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 

我也做了一些基準以及以上兩種解決方案並且都給出幾乎相同的時間。你也可以測試它。我給這兩個函數提供了一個文件來讀取,其中有大約60000個字符(用Word的字數統計),並且這兩個函數在大約0.000999秒內找到。

$startTime = microtime(true); 
GetBetween($str, '<start>', '<end>'); 
echo "Explodin Function took: ".(microtime(true) - $startTime) . " to finish<br />"; 

$startTime = microtime(true); 
get_string_between($str, '<start>', '<end>'); 
echo "Subsring Function took: ".(microtime(true) - $startTime) . " to finish<br />"; 
相關問題