【问题标题】:PHP Regex to get numbers before string with parenthesesPHP正则表达式在带括号的字符串之前获取数字
【发布时间】:2012-04-08 04:33:17
【问题描述】:

试图抓取 (h)、(w) 和 (d) 前面的数字。这些是动态的,我无法获得它的语法:

    <ul>
      <li>Make: Mymake</li>
      <li>Model: R-22GTF</li>
      <li>Dimensions: 13.25&#34; (h) x 20.13&#34; (w) x 18.5&#34; (d)</li>
      <li>Sold Individually </li>
      <li>Weight: 0 lbs.</li>
    </ul>

if (preg_match("/Dimensions: ((?:\d+)(?:\.\d*)?)/", $desc, $DIMS) == true)
    { echo $DIMS[1];}

上面只返回13.25。我希望每个都有自己的数组或自己的变量。每个由 (h) 之前的数字、(w) 之前的数字和 (d) 之前的数字定义。

【问题讨论】:

  • 听起来是研究正则表达式语法的好机会,因为这不是一件复杂或困难的事情。我建议尝试 learn 而不是跑到 SO 让其他人为你做这件事。 (?: 告诉 PHP 您想要捕获括号内的组。
  • 有趣的是,我一直在寻找一个小时这是什么意思,谷歌无法帮助我解释。
  • 请定义每个。然后注意子模式匹配在 PHP 中是有限的,您需要为每个要匹配的子组编写所有模式。
  • 我试过 googledoesntwork.com 但它还没有启动 =p。顺便说一句,我一直在寻找“冒号在 REGEX 中的作用”这些网站都没有告诉我,不过感谢您为我搜索!

标签: php regex preg-match parentheses


【解决方案1】:
<?php

$input = "    
     <ul>
      <li>Make: Mymake</li>
      <li>Model: R-22GTF</li>
      <li>Dimensions: 13.25&#34; (h) x 20.13&#34; (w) x 18.5&#34; (d)</li>
      <li>Sold Individually </li>
      <li>Weight: 0 lbs.</li>
    </ul>";

$re = '/.* (\d+\.\d+).*\(h\) .* (\d+\.\d+).*\(w\) .* (\d+\.\d+).*\(d\)/';
if(preg_match($re, $input, $matches))
   echo sprintf("H: %s   W: %s   D: %s\n", $matches[1], $matches[2], $matches[3]);
?>

【讨论】:

  • 这与 " 13.25&amp;#34; (h)x 20.13&amp;#34; (w) x 18.5&amp;#34; (d)"" 13.25&amp;#34; (h) (w) (d)" 不匹配,但 OP 有时不知道抓取问题。
  • 是的,但输出看起来像是由服务器生成的,因此可以安全地假设这些变化不会发生。如果服务器改变静态部分,即。 “(h)x”与“(h)x”,或者写“”而不是“0.00"”,那么谁知道该服务器会发生什么。如果真的是这样,那么我想 OP 真的必须学习一点正则表达式.. ;-)
【解决方案2】:

尝试下面的正则表达式,希望我能很好地理解您要提取的内容:)

[\d.]+(?=&)

编辑:

全局正则表达式

/[\d.]+(?=&)/g

另外,如果您想测试正则表达式的各种组合,请尝试一些实时在线正则表达式验证器,例如:

http://gskinner.com/RegExr/

它会在您键入时匹配您的表达式。

【讨论】:

  • 据我了解,这只是再次获取13.25。我还需要尝试抓取其他数字并将它们放入变量中。
  • 如果它没有抓住所有,尝试像我编辑的帖子中的全局迭代
  • 正则表达式训练工具的好链接......我已经有一段时间没有玩正则表达式了:)
  • 不错的工具。尽管这很有意义并且可以与提供的链接一起使用,但是当我插入 if (preg_match("/[\d.]+(?=&amp;)/g", $desc, $DIMS) == true) 时它仍然给我一个错误 Unknown modifier 'g'
【解决方案3】:

你应该可以在这个上做一个 print_r($DIMS)

Dimensions:[^\d.;(&lt;]*([\d.]*)[^;(&lt;]*;[^(&lt;]*\(h\)[^\d.;(&lt;]*([\d.]*)[^;(&lt;]*;[^(&lt;]*\(w\) [^\d.;(&lt;]*([\d.]*)[^;(&lt;]*;[^(&lt;]*\(d\)

展开

Dimensions: 
   [^\d.;(<]* ([\d.]*) [^;(<]* ; [^(<]* \(h\)
   [^\d.;(<]* ([\d.]*) [^;(<]* ; [^(<]* \(w\)
   [^\d.;(<]* ([\d.]*) [^;(<]* ; [^(<]* \(d\)

它对验证有点严格,但它很贪心,所以冗余的溢出限制是必要的。如果需要,您可以将否定类替换为 .*?

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 2010-09-29
    • 2015-07-05
    • 2013-07-20
    相关资源
    最近更新 更多