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

时间:2013-12-24 07:19:22

标签: php while-loop html-parsing

以下功能仅提​​取第一次出现的内容。在这种情况下,它返回:" John Smith jsmith@gmail.com" ;,如何使用相应的电子邮件获取其他名称。

感谢您的帮助。

<?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 个答案:

答案 0 :(得分:2)

好像你正试图分别打印名称和电子邮件的价值。那你为什么不尝试这样简单的东西?

$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>";
$arr=array_map('trim',array_filter(explode('<br>',$fullstring),'strlen'));

foreach($arr as $value)
{
    echo $value."<br>";
}

输出:

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

如果您不需要Name :Email :,只需将下面的 echo 语句替换为 {{1}内的语句构建。

foreach

答案 1 :(得分:1)

strpos()只能找到第一次出现的数字位置,因此您的函数不能用于查找多次出现。您可以使用preg_match_all()的正则表达式执行此操作:

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

用法:

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

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

输出:

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

现在,要打印名称和电子邮件,您只需循环遍历结果数组,如下所示:

$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/>';
}

输出:

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

Demo.

答案 2 :(得分:1)

这是循环查找所有匹配的方法:

function get_string_between($string, $start, $end) {
    $last_end = 0;
    $matches = array();
    while (($ini = strpos($string, $start, $last_end)) !== false) {
        $ini += strlen($start);
        $len = strpos($string,$end,$ini) - $ini;
        $matches[] = substr($string, $ini, $len);
        $last_end = $ini + $len + strlen($end);
    }
    return $matches;
}

它返回每个开始和结束之间所有字符串的数组,您需要在调用者中使用循环或implode()来打印它们。