doufei5315 2013-12-24 07:19
浏览 40

在字符串之间获取字符串并在PHP中循环内容

The function below fetches only the first occurrence. In this case it returns: "John Smith jsmith@gmail.com", how do I get the other names with their corresponding Emails.

I appreciate your help.

<?php
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);
}

////////////// CONTENT TO BE PARSED ///////////////////
$fullstring = 'Name: John Smith<br> Email: jsmith@google.com<br> Name: Perter Doe<br>Email: peterd@yahoo.com<br> Name: Nelly Denver<br> Email: neldenver@google.co.za<br>'; 

///////////////////////////////////

$parsed1 = get_string_between($fullstring, "Name:", "<br>");
$parsed2 = get_string_between($fullstring, "Email: ", "<br>");

$parsed = $parsed1.'<br>'.$parsed2.'<br>';

echo $parsed;

?>
  • 写回答

3条回答 默认 最新

  • dtbl1231 2013-12-24 07:28
    关注

    strpos() can only find the numeric position of the first occurrence and hence your function can't be used to find multiple occurences. You could use a regex with preg_match_all() to do this:

    function get_string_between($string, $start, $end) {
        $start = preg_quote($start);
        $end = preg_quote($end);
        $pattern = "~$start\s*(.*?)$end\s*~";
        $match = preg_match_all($pattern, $string, $matches);
        if ($match) {
            return $matches[1];
        }
    }
    

    Usage:

    $parsed1 = get_string_between($fullstring, 'Name:', '<br>');
    print_r($parsed1);
    
    $parsed2 = get_string_between($fullstring, 'Email:', '<br>');
    print_r($parsed2);
    

    Output:

    Array
    (
        [0] => John Smith
        [1] => Perter Doe
        [2] => Nelly Denver
    )
    Array
    (
        [0] => jsmith@google.com
        [1] => peterd@yahoo.com
        [2] => neldenver@google.co.za
    )
    

    Now, to print the names and emails, you can simply loop through the result arrays, like so:

    $parsed1 = get_string_between($fullstring, 'Name:', '<br>');
    $parsed2 = get_string_between($fullstring, 'Email:', '<br>');
    
    for ($i=0; $i < count($parsed1); $i++) { 
        echo $parsed1[$i] . ' ' . $parsed2[$i] . '<br/>';
    }
    

    Output:

    John Smith jsmith@google.com
    Perter Doe peterd@yahoo.com
    Nelly Denver neldenver@google.co.za
    

    Demo.

    评论

报告相同问题?

悬赏问题

  • ¥100 iOS开发关于快捷指令截屏后如何将截屏(或从截屏中提取出的文本)回传给本应用并打开指定页面
  • ¥15 unity连接Sqlserver
  • ¥15 图中这种约束条件lingo该怎么表示出来
  • ¥15 VSCode里的Prettier如何实现等式赋值后的对齐效果?
  • ¥15 流式socket文件传输答疑
  • ¥20 keepalive配置业务服务双机单活的方法。业务服务一定是要双机单活的方式
  • ¥50 关于多次提交POST数据后,无法获取到POST数据参数的问题
  • ¥15 win10,这种情况怎么办
  • ¥15 如何在配置使用Prettier的VSCode中通过Better Align插件来对齐等式?(相关搜索:格式化)
  • ¥100 在连接内网VPN时,如何同时保持互联网连接