【问题标题】:PHP preg_replace -####/ [duplicate]PHP preg_replace -####/ [重复]
【发布时间】:2012-02-11 15:01:16
【问题描述】:

我又回来了,再次表明我的无知。

我需要帮助来获取特定位置 URL 中的数字。 URL 的其余部分也可能包含数字,因此我需要将其限制为仅从一个位置获取数字,例如:

http://www.example.com/99-Kittens-1382/animals

我一直在使用 ereg_replace 来获取所有数字,但后来意识到:
1) ereg_replace 已弃用
2) 一些网址可能在其他地方有数字。

所以在这种情况下,我最终得到了 991382 而不是我想要的 1382。

URL 结构应该始终是我们有 -####/ 所以我认为我们应该能够基于此进行匹配。 (破折号,四个数字,正斜杠)

我一直对正则表达式匹配很糟糕。谁能帮帮我?

【问题讨论】:

标签: php preg-replace str-replace ereg-replace


【解决方案1】:

如果没有正则表达式的复杂性,这可能会更好:

$urlParts = parse_url($str);
$pathParts = explode('/', $urlParts['path']);
$firstParts = explode('-', $pathParts[1]);
$numberYouWant = array_pop($firstParts);

See it working

【讨论】:

  • 完美。谢谢你。如果允许,我会在 5 分钟内“检查”你的答案。
  • 你试过这个的性能吗?以我的经验,explode() 相当昂贵,可能比正则表达式更贵。 parse_url 似乎也很密集。
  • 我在我需要的页面上实现了它(在标题中),页面加载时间不到 1 秒。
  • @EugenRieck 我没有,尽管我们可能在谈论微秒 - 这取决于您在脚本的单次执行中需要执行多少次。请记住,PCRE 引擎也非常昂贵......
【解决方案2】:
preg_match('#-(\d{4})/#', $url, $matches);
echo $matches[1];

【讨论】:

  • 还不错,但是如果 url 是 http://www.example.com/I-Would-Like-2199-Kittens-1382/animals - 你会得到 2199
  • 仍然有效。由于 / 要求,您将无法匹配 2199。此正则表达式的唯一假设是 1) 所需数字是 4 位数字,2) 以 -/ 为边界,3) 第一个匹配项是唯一重要的匹配项。可以想象,我们可以有http://www.example.com/something/kitten-1234/animals,但我从 OP 那里不太了解在这种情况下匹配是否正确。我们需要完整的输入范围以及所需的部分(例如,“第一个 url 路径部分中破折号后的最终数字”。)
  • 公平点,忘了/。唯一不符合 OPs 要求的地方(我怀疑)是位数可能并不总是 4。尽管这可以很容易地通过 {1,n} 子句规避,其中 n 是最大字符数.
【解决方案3】:
$a="http://www.example.com/99-Kittens-1382/animals";
echo preg_match("/.*?\\/(\\d+)-.*?-(\\d+)\\//",$a,$m)."\n";
print_r($m);

给予

1
Array
(
    [0] => http://www.example.com/99-Kittens-1382/
    [1] => 99
    [2] => 1382
)

【讨论】:

    【解决方案4】:
    $return = preg_match('/-([0-9]{4})/', 'http://www.example.com/99-Kittens-1382/animals', $matches)
    

    应该可以, ( 和 ) 分组匹配,[0-9] 是要匹配的字符范围,{4} 是您要匹配的前一组的确切数量。比赛在 $matches[1]

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 2014-04-29
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2013-07-17
      • 2012-11-16
      • 1970-01-01
      相关资源
      最近更新 更多