PHP函数getAllBetweenStr使用正则表达式

时间:2012-10-05 13:23:24

标签: php arrays regex string substring

  

可能重复:
  Get content between two strings 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")

返回数组就是这样的 数组([0] =&gt;“abc / b1”,[1] =&gt;“abc / b2”,...,[n] =&gt;“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);
    }

5 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分: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);

答案 2 :(得分:0)

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

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

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

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

parens()告诉它捕获字符串的那一部分。 “。*?”在parens中指示它捕获所有字符,直到下面的内容。

答案 3 :(得分: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>';
}

希望它有效。

答案 4 :(得分: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);
?>