我在编写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/>";
}
有人可以帮忙吗?
答案 0 :(得分:8)
<?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
应该是您文件的内容。
请查看i
,m
和s
修饰符的http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php。
答案 1 :(得分: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;
}
希望这有帮助。
答案 2 :(得分:2)
我喜欢这两种解决方案
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 />";