【问题标题】:regex expression match parts of an string正则表达式匹配字符串的一部分
【发布时间】:2012-11-25 03:20:58
【问题描述】:

从 curl 获取页面后,我试图将部分字符串匹配到变量中

字符串是

value="http://ca.isohunt.com/upload.php?mode=bt&id=880001&sid=3096d80a1c9d2962f8f35a837a3f23e0"

我正在尝试获取&id=''$sid=''

我尝试使用 preg_match 使用这个正则表达式,但它不起作用

/([^_]*?)&sid-.*?\$

【问题讨论】:

  • 啊,忽略所有使用 regex 的答案。 . .正则表达式对此是错误的。使用 @m.buettner 的回答中提到的 PHP 的内置函数 parse_urlparse_str

标签: php regex


【解决方案1】:

使用parse_url

$url = 'http://username:password@hostname/path?arg=value#anchor';
$data = parse_url($url);
print_r(parse_url($url));

上面的例子会输出:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

然后:

 $queryFields = split('[&]', $data['query']);

【讨论】:

    【解决方案2】:
      if ($c=preg_match_all ("/.*?(id=)(\d+).*?(sid=)([a-zA-Z0-9_]{1,})/is", $txt, $matches))
      {
          $id=$matches[2][0];
          $sid=$matches[4][0];
          print "id = $id <br> sid = $sid\n";
      }
    

    这里是您可以用来获取 2 个值的代码。这将为您获取 2 个参数的值。

    【讨论】:

    • 当检索代码已硬编码0s 时,为什么要使用preg_match_all
    • true 你可以使用 preg_match 只获得第一次出现
    【解决方案3】:

    首先,您不应该转义 $,除非您期望它出现在“值”字符串中。

    您的正则表达式可以是/&amp;?sid=([^&amp;]+)//&amp;?id=([^&amp;]+)/,前提是您不想对网址本身进行任何检查。或合并:/&amp;?id=([^&amp;]+).*&amp;?sid=([^&amp;]+)/

    请记住,当您调用 preg_match('/&amp;?id=([^&amp;]+).*&amp;?sid=([^&amp;]+)/', $value, $matches); 之类的内容时,这些值将导出到 $matches[1]$matches[2]

    【讨论】:

      【解决方案4】:

      您不应该为此使用正则表达式。

      如果您的输入字符串包含value="(以及末尾的"),只需提取URL。您可能可以使用substr 最简单地做到这一点:

      $url = substr($input, 7, -1);
      

      如果字符串比较多变,而您只知道 URL 是引号内的内容,请使用:

      preg_match('/".*"/', $input, $match);
      $url = $match[0];
      

      如果你的$input只有URL,你当然可以完全跳过这一步。那么:

      $query = parse_url($url, PHP_URL_QUERY);
      $params = array();
      parse_str($query, $params);
      
      echo $params['mode'];  // bt
      echo $params['id']; // 880001
      echo $params['sid']; // 3096d80a1c9d2962f8f35a837a3f23e0
      

      【讨论】:

      • 为了完整起见,您也可以使用不带第二个参数的parse_str,并且会为您设置变量 $mode、$id 和 $sid - 请注意,这可能会破坏现有变量。
      • @ernie 是的,最后一点就是为什么我想掩盖这种可能性:D
      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多