-2

可能重复:
获取两个字符串 PHP 之间的内容

我正在尝试创建一个 php 函数,该函数将返回两个子字符串之间所有出现的文本的数组。我对正则表达式毫无用处,会觉得这很方便,我敢肯定那里已经有一个非常好的,但我找不到。

    function getAllBetweenStr($input, $start, $end)
    {
         //DO STUFF

         //RETURN ARRAY
    }


$inputStr ="<a href='http://formaco4/en/abc' class='currentLink' hreflang='en'>abc1/a>
<a href='http://formaco4/en/abc/b1'  hreflang='en'>abc2</a>
<a href='http://formaco4/en/abc/b2'  hreflang='en'>abc3</a>
<a href='http://formaco4/en/abc/b3'  hreflang='en'>abc4</a>";


$linkStr = array();
$linkStr = getAllBetweenStr($inputStr, "http://formaco4/en/'", "'  hreflang")

返回数组将是这样的 Array([0] => "abc/b1", [1] => "abc/b2", ... , [n] => "gingers/rule")

如果有帮助,我已经有了这个功能:

    function getBetweenStr($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);
    }
4

5 回答 5

1

我相信这样的事情会起作用 - 它用于preg_match_all捕获两者$start$end字符串之间的任何内容。

function getBetweenStr($string, $start, $end)
{
    preg_match_all( '/' . preg_quote( $start, '/') . '(.*?)' . preg_quote( $end, '/') . '/', $string, $matches);
    return $matches[1];
}
于 2012-10-05T13:32:18.163 回答
0
<?php

function getAllBetweenStr($string, $start, $end)
    {
        $array_to_return = array();
        for($i=0; $i<count(explode($start,$string))-1; $i++) {
        $str_0 = explode($start,$string);
        $str_1 = explode($end, $str_0[1]);
        $array_to_return[$i] = $str_1[0];
        }
        return $array_to_return;
    }

$inputStr ="<a href='http://formaco4/en/abc' class='currentLink' hreflang='en'>abc1</a>
<a href='http://formaco4/en/abc/b1'  hreflang='en'>abc2</a>
<a href='http://formaco4/en/abc/b2'  hreflang='en'>abc3</a>
<a href='http://formaco4/en/abc/b3'  hreflang='en'>abc4</a>";
$linkStr = getAllBetweenStr($inputStr, "hreflang='en'>", "</a>");
print_r ($linkStr);
?>
于 2012-10-05T13:50:40.953 回答
0

我的不使用 preg_match 函数。希望你会发现这很有用

试试这个,我还为你提供了更好的功能(::

function stribet($inputstr, $delimiterLeft, $delimiterRight) {
    $posLeft = stripos($inputstr, $delimiterLeft) + strlen($delimiterLeft);
    $posRight = stripos($inputstr, $delimiterRight, $posLeft);
    return substr($inputstr, $posLeft, $posRight - $posLeft);
}

$links = array("<a href='http://formaco4/en/abc' class='currentLink' hreflang='en'>abc1/a>", "<a href='http://formaco4/en/abc/b1'  hreflang='en'>abc2</a>");

foreach ($links as $linkstr){
$linkstr = stribet($linkstr, "http://formaco4/en/'", "'  hreflang='");
//echo $linkstr;
$data[] = $linkstr;
}

print_r($data);

如果您只想坚持使用普通的字符串函数,请尝试爆炸<a 然后使用 foreach 循环来获取您的数据。

就像是

$inputStr ="<a href='http://formaco4/en/abc' class='currentLink' hreflang='en'>abc1/a>
<a href='http://formaco4/en/abc/b1'  hreflang='en'>abc2</a>
<a href='http://formaco4/en/abc/b2'  hreflang='en'>abc3</a>
<a href='http://formaco4/en/abc/b3'  hreflang='en'>abc4</a>";
$inputArray = explode ("<a", $inputStr);
  foreach ($inputArray as $linkstr){
    $linkstr = stribet($linkstr, "http://formaco4/en/'", "'  hreflang='");
    //echo $linkstr;
    $data[] = $linkstr;
    }

    print_r($data);
于 2012-10-05T13:32:18.250 回答
0

学习正则表达式真的很值得。它们非常强大和有用:

preg_match_all('|'.preg_quote($start).'(.*?)'.preg_quote($end).'|', $input, $linkStr);

在您的示例中,这将构建一个正则表达式:

|http:\/\/formaco4\/en\/\(.*?)  hreflang|

parens () 告诉它捕获字符串的那部分。这 ”。*?” 在括号内指示它捕获所有字符,直到后面的内容。

于 2012-10-05T13:32:21.573 回答
0

试试这个(未经测试):

function find_occurencies($start, $search, $end)
{
    $start = stripslashes($start);
    $end = stripslashes($end);
    $search = stripslashes($search);

    $pattern = '%'. $start . '([\s\w]+)?' . $end . '%';
    preg_match_all($pattern, $search, $matches);

    // Print the matches (should)
    echo '<pre>';
    print_r($matches);
    echo '</pre>';
}

希望它有效。

于 2012-10-05T13:34:05.800 回答