【问题标题】:preg_match returning weird resultspreg_match 返回奇怪的结果
【发布时间】:2009-11-20 23:09:58
【问题描述】:

我正在为 url 搜索字符串...而我的 preg_match 为我的演示字符串提供了不正确的匹配数量。

字符串:

嘿,来看看我的网站 www.example.com

功能:

preg_match("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t<]*)#ise", $string, $links);
echo count($links);

结果为 3。

谁能帮我解决这个问题?我是 REGEX 的新手。

【问题讨论】:

  • 您能否解释一下您是如何尝试检测 URL 的,以及您期望的结果是什么?看起来您正在尝试检测“://”,但您的字符串不包含它。
  • e 修饰符仅用于preg_replace
  • 检查 preg_match 的返回值以查看正则表达式是否匹配任何内容。
  • @Mark ya...就像我说的我很新...很可能是我扔在那里的蹩脚模式:(我只是搜索图书馆。我想我几乎得到了它下来

标签: php regex preg-match


【解决方案1】:

$linksarray of sub matches

如果提供了matches,则填充搜索结果。 $matches[0] 将包含与完整模式匹配的文本,$matches[1] 将包含与第一个捕获的带括号的子模式匹配的文本,依此类推。

两组的匹配加上全正则表达式的匹配产生三个数组项。

也许您更希望使用preg_match_all 进行所有匹配。

【讨论】:

    【解决方案2】:

    如果您使用 preg_match_pattern(如 Gumbo 建议的那样),请注意,如果您针对此字符串运行正则表达式,它将与您的锚属性“href”的值以及在这种情况下发生的链接文本匹配包含一个网址。这会产生两个匹配项。

    在您的结果集上运行 array_unique 是明智之举:)

    【讨论】:

      【解决方案3】:

      除了关于如何使用preg_match 的建议之外,我认为您使用的正则表达式存在严重错误。您可能想尝试这样的事情:

       preg_match("_([a-zA-Z]+://)?([0-9a-zA-Z$-\_.+!*'(),]+\.)?([0-9a-zA-Z]+)+\.([a-zA-Z]+)_", $string, $links);
      

      这应该可以处理大多数情况(尽管如果在顶级域之后有一个查询字符串,它将不起作用)。以后在编写正则表达式时,我推荐以下网站提供帮助:http://www.regular-expressions.info/,尤其是http://regexpal.com/,以便在您编写正则表达式时对其进行测试。

      【讨论】:

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