【问题标题】:Search for a string in a php file with a start and end在 php 文件中搜索带有开头和结尾的字符串
【发布时间】:2011-08-28 02:03:24
【问题描述】:

我在编写 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/>";
}

有人可以帮忙吗?

【问题讨论】:

  • 您能否举一个示例输入的示例,以及您期望的结果是什么?
  • 作为旁注,我猜你想要尽可能小的匹配。如果是这样,您需要使匹配不贪心:(.|\n)*?。此外,请注意可能包含正则表达式特殊字符的 $start$end 字符串。
  • $start$end的内容是什么?
  • @krookedking 我想搜索整个文件并返回结果,即使有新行。
  • @Femi 我没有收到错误,但我无法得到我想要的结果。

标签: php regex search


【解决方案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 />";

【讨论】:

    【解决方案2】:
    <?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.php 中的 ims 修饰符。

    【讨论】:

    • @Songo 现在会了。请参阅 s 修饰符。 (答案的最后一行)
    【解决方案3】:

    你不需要正则表达式。

    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;
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-07-04
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      相关资源
      最近更新 更多