【问题标题】:Trouble with regex and preg_match() - can't get results to save正则表达式和 preg_match() 的问题 - 无法保存结果
【发布时间】:2013-01-23 22:28:52
【问题描述】:

我正在为我正在开发的一个网站构建一个动态链接系统,这样您就可以输入{_LINK_20_} 之类的内容,它会根据是否动态输入 onclick 事件或 href 属性用户启用或禁用了 javascript。

唯一的问题是我最初使用循环来遍历文档,但我意识到正则表达式会更好地工作,这样我就可以拥有不连续的链接 ID,它仍然可以检测到它们。

我只是在示例页面中对其进行测试,然后再尝试将其嵌入到我的 OOP 后端中,所以这里是示例代码:

$results = array();
$string = 'asdfasdf {_LINK_2_} asdf {_LINK_1_}{_LINK_3_} asdf{_LINK_8_}';
$exp = '/{_LINK_<0-9>+_}/';
$find = preg_match($exp, $string, $results);

但是,当我使用print_r() 输出数组$results 时,它没有结果。我在正则表达式语法方面几乎是一个完整的新手,所以请放轻松。 :)

我真正想做的是只保存匹配文本中的数字,这样我就可以遍历正则表达式结果并根据需要替换每个链接,而无需调用 preg_replace()str_replace()

我也尝试过preg_match_all() 功能,但也没有用。先谢谢了,抱歉我的正则表达式太差了!

【问题讨论】:

    标签: php regex preg-match pcre preg-match-all


    【解决方案1】:

    试试这个正则表达式:

    $exp = '/{_LINK_[0-9]+_}/'
    

    并使用 preg_match_all。

    字符类是用方括号('[]')实现的,而不是尖括号('')。只需使用正确的括号即可使您的正则表达式起作用。

    如果你真的只想保存数字,你可以使用这个正则表达式:

    $exp = '/(?<={_LINK_)[0-9]+(?=_})/'
    

    Click here 在 RegExr 中查看。它通过使用后向和前向来工作,它们是零宽度断言(意味着它们在字符之间匹配,而不是匹配字符本身)关于在其他正则表达式之后或之前的内容。

    在 ideone.com 上查看 here

    【讨论】:

    • 谢谢,这对我很有帮助,我现在开始工作了!对答案 +1 并接受它。
    • 其实{}只在以下情况下才被视为特殊字符:{5}(精确次数),{5,}(最小次数到无穷大) , {5,42}(时间范围)。在提供的正则表达式中,他们会匹配自己。它们是唯一具有这种行为的元字符。但是,无论如何最好避开它们。
    • @CJDennis it seems you're right,无论如何在 PHP 中。不过,我不同意无论如何逃避它们是“好习惯”。你应该只逃避需要逃避的东西,而不是别的。它有助于加强您对字符串包含的内容以及正则表达式解析器看到/期望的内容的理解。我将编辑我的回复以反映这一点。
    猜你喜欢
    • 2023-03-24
    • 2023-03-26
    • 2014-04-27
    • 2014-07-01
    • 1970-01-01
    • 2013-04-05
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多