【问题标题】:PHP function getAllBetweenStr using regular expression [duplicate]PHP函数getAllBetweenStr使用正则表达式[重复]
【发布时间】:2012-09-26 16:00:25
【问题描述】:

可能重复:
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")

返回数组是这样的 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);
    }

【问题讨论】:

  • 这实际上是 preg_match / preg_match_all (在你的情况下)是为......
  • 您将 $linkstr 定义为一个数组。然后,您将 $linkstr 定义为字符串(返回 substr),当您想将其作为数组时,您必须将其定义为 $link[]。

标签: php arrays regex string substring


【解决方案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];
}

【讨论】:

    【解决方案2】:

    我的不使用 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);
    

    如果您只想坚持使用普通字符串函数,请尝试爆炸&lt;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);
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 需要转义$start$end,否则会破坏正则表达式。
      • 谢谢,我提交后就想到了。我在您输入评论时添加了它:)
      • 使用|作为分隔符是非常不规则的,特别是因为它也用于交替:)
      【解决方案4】:

      试试这个(未经测试):

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

      希望它有效。

      【讨论】:

      • 需要转义$start$end,否则会破坏正则表达式。
      • 嗯,是的……我还在更新;)
      • 警告:preg_match_all() [function.preg-match-all]:编译失败:偏移 0 处没有可重复的内容
      • 快到了,但输入字符串中的一些字符破坏了正则表达式
      【解决方案5】:
      <?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);
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        相关资源
        最近更新 更多