【问题标题】:preg_match: equal sign in patternpreg_match:等号模式
【发布时间】:2011-06-30 13:23:05
【问题描述】:

我有这个问题:

list[One]=1&list[Two]=2&list[Apple]=fruit


这是我用来返回括号中和等号后的值的正则表达式

preg_match_all('/(?<query>list\[(?<pagename>.*?)\]\=(?<parent>.*?))/',$source,$array);


返回:

One=  
Two=  
Apple= 


等号之后的值丢失。我的错在哪里?

顺便说一下,这个查询是用 jquery 的 serialize() 生成的。有没有更好的方法来解析这些值?

【问题讨论】:

  • 你知道parse_str吗?
  • 我喜欢有人自己编写一个函数,而已经有一个 php 函数:D 几乎所有东西都有一个 php 函数

标签: php jquery regex serialization


【解决方案1】:

正如我在评论中所说,您可能想查看parse_str

但是,如果您将最终的 .*? 更改为 [^&amp;]* 之类的东西,那么您可能会有更好的运气(假设这是一个 GET 查询字符串(或一些传真),因为 &amp; 必须从%26的序列)

【讨论】:

  • +1 不错! parse_str($query, $matches); return $matches['list']; 像冠军一样工作,产生的结果与我的回答相同。
  • 太好了,非常感谢!
【解决方案2】:

(?&lt;parent&gt;.*?) 匹配一个空字符串,所以结果是“正确的”。改用(?&lt;parent&gt;[^&amp;]+)

preg_match_all('/(?<query>list\[(?<pagename>.*?)\]\=(?<parent>[^&]+))/',$source,$array);

【讨论】:

    【解决方案3】:

    因为您将非贪婪的? 用于&lt;parent&gt;,所以它没有获取值。尝试其他答案,或者如果您可以依靠 list[&lt;name&gt;]=&lt;value&gt; 格式,那么您可以完全避免使用正则表达式。

    $query = 'list[One]=1&list[Two]=2&list[Apple]=fruit';
    $pieces = explode('&', $query);
    $matches = array();
    foreach ($pieces as $piece) {
        list($key, $value) = explode('=', $piece);
        $matches[substr($key, 5, -1)] = $value;
    }
    

    【讨论】:

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