【问题标题】:php regex vs strpos for accuracyphp regex 与 strpos 的准确性
【发布时间】:2013-12-02 02:43:28
【问题描述】:

我已经阅读了比较这两个函数的其他帖子。 strpos()preg_match()。我知道strpos() 是您要查找的确切字符串,但如果搜索主题出现在字符串中怎么办。

$string = 'Honda 1974 1975 CB200 T Front ATK Wheel Hub w/ Brake Disc Rotor 18" x 1.60 Straight!';

我需要寻找 CB200 和一堆其他类似的型号,例如 CB1000、CR250、CR125 等等。

如果我用过

preg_match('/^.*\b(c{1}b{1}2{1}0{1}0{1})\b.*$/i',$string)

我会得到前面或后面没有任何内容的确切字符串,但 strpos($string,'CB200') 会找到匹配项,无论搜索主题的前面或后面是什么。
示例:Honda FrontCB200ATK Wheel Hub。如果那是零件号,那么strpos() 将失败。我可以让strpos() 更准确还是在这种情况下我需要使用preg_match()?放弃strpos()的速度。该脚本将在每次执行时最多比较 10,000 个$string,每次比较时要遵循多个条件。

【问题讨论】:

  • 看看这里:stackoverflow.com/questions/6896587/… 不完全是你在说什么,但它可能会帮助你找出一个更优雅的解决方案。虽然无法回答有关提高 str[i]pos() 准确性的问题。
  • @r3mus 好的,谢谢你的链接。我厌倦了阅读有关strpos()preg_match() 的内容。好像我只是一直在读同样的东西。与客户交谈,模型非常独特,因此我将使用str_pos() 不区分大小写,因为客户声明所有模型都将使用大写字母。
  • 这是我最终使用的:(strpos($data[$i]['title'], 'CB1000') !== false) ? $data[$i]['category_id']=123 : '';

标签: php regex


【解决方案1】:

每个人对某事都有不同的看法,最好的比较方法就是其中之一。

我很可能更喜欢使用strpos() 而不是preg_match(),因为正则表达式通常更昂贵。这两个函数都很快,但是如果您担心性能,那么您应该在这种情况下使用strpos() 来测试字符串。

preg_match() 的文档明确指出:

如果您只想检查一个字符串是否包含在另一个字符串中,请不要使用 preg_match()。请改用 strpos() 或 strstr(),因为它们会更快。

如果您想使用preg_match(),我会将您的表达式改写为以下内容。

preg_match('/\b(?:cb[12]000?|cr[12][25][50])\b/i', $string);

【讨论】:

  • 仅出于这个原因,我决定使用strpos(),正则表达式会更准确,但在这种情况下,我认为我不需要担心这一点。我只是担心strpos() 会在一个单词中找到匹配项。 EX:FrontCB200ATK 轮毂 EX2:本田 1974 1975 CB200 T 前 ATK 轮毂preg_match() 只会匹配正确的一个 strpos() 会匹配两者。 $needle='CB200'
【解决方案2】:

由于 preg_match() 的准确性,我倾向于专门使用 preg_match 进行表单验证。

【讨论】:

    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多