regex 获取两个字符串之间的内容PHP

ua4mk5z4  于 2023-06-25  发布在  PHP
关注(0)|答案(7)|浏览(144)

获取两个字符串之间的内容的最佳方法是什么?

ob_start();
include('externalfile.html'); ## see below
$out = ob_get_contents();
ob_end_clean();

preg_match('/{FINDME}(.|\n*)+{\/FINDME}/',$out,$matches);
$match = $matches[0];

echo $match;

## I have used .|\n* as it needs to check for new lines. Is this correct?

## externalfile.html

{FINDME}
Text Here
{/FINDME}

出于某种原因,这似乎在我的代码中的一个地方工作,而不是另一个地方。我这样做对吗还是有更好的办法?
另外,是输出缓冲区的方式来做到这一点或文件_得到_内容?
先谢谢你了!

zzlelutf

zzlelutf1#

你也可以使用substr和strpos。

$startsAt = strpos($out, "{FINDME}") + strlen("{FINDME}");
$endsAt = strpos($out, "{/FINDME}", $startsAt);
$result = substr($out, $startsAt, $endsAt - $startsAt);

您需要添加错误检查来处理它没有FINDME的情况。

mi7gmzs6

mi7gmzs62#

  • 使用#而不是/,这样你就不必逃避它们了。
  • modifiers允许.匹配换行符。
  • {可以是{n}{n,m}量词的开始。关闭的}没有特殊意义,但是转义它不会导致错误。
  • 基本的
preg_match('#\{FINDME}(.+)\{/FINDME}#s', $out, $matches);
  • 高级的各种标签等(样式不是那么好的JavaScript)。
$delimiter = '#';
  $startTag = '{FINDME}';
  $endTag = '{/FINDME}';
  $regex = $delimiter . preg_quote($startTag, $delimiter) 
                      . '(.*?)' 
                      . preg_quote($endTag, $delimiter) 
                      . $delimiter 
                      . 's';
  preg_match($regex,$out,$matches);

将此代码放入函数中

  • 对于任何你不想执行任何 stray php代码的文件,你应该使用file_get_contents。包括/要求甚至不应该是一个选项。
drkbr07n

drkbr07n3#

如果可能的话,我喜欢避免使用正则表达式,这里有一个替代方案来获取两个字符串之间的所有字符串并返回一个数组。

function getBetween($content, $start, $end) {
    $n = explode($start, $content);
    $result = Array();
    foreach ($n as $val) {
        $pos = strpos($val, $end);
        if ($pos !== false) {
            $result[] = substr($val, 0, $pos);
        }
    }
    return $result;
}
print_r(getBetween("The quick brown {{fox}} jumps over the lazy {{dog}}", "{{", "}}"));

结果如下:

Array
(
    [0] => fox
    [1] => dog
)
y0u0uwnf

y0u0uwnf4#

我喜欢这两种解决方案

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个字符(与Ms. 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 />";
093gszye

093gszye5#

换行符可能会导致RegEx出现问题,请在处理之前尝试将其删除或替换为\n。

dwbf0jvd

dwbf0jvd6#

这是一个PHP解决方案,返回在haystack中的标记之间找到的字符串。它工作,但我还没有测试的效率。我需要这一点,并受到亚当赖特在这一页上的答案的启发。
返回一个数组(),其中包含在$haystack中$tag和$end_symbol.$tag之间找到的所有字符串,如果没有找到$end_symbol.$tag,则返回FALSE,因此$haystack中不存在标记对。

function str_between_tags($haystack, $tag, $end_symbol){
    $c_end_tags = substr_count($haystack, $end_symbol.$tag);
    if(!$c_end_tags) return FALSE;

    for($i=0; $i<$c_end_tags; $i++){
        $p_s = strpos($haystack, $tag, (($p_e)?$p_e+strlen($end_symbol.$tag):NULL) ) + strlen($tag );
        $p_e = strpos($haystack, $end_symbol.$tag, $p_s);
        $result[] = substr($haystack, $p_s, $p_e - $p_s);
    }
    return $result;
}
5ktev3wc

5ktev3wc7#

快速的方法把所有的东西放在一个字符串。

$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$one_string = str_replace($newlines, "", html_entity_decode($content));

相关问题