使用正则表达式和preg_match()时出现问题 - 无法获得保存结果

时间:2013-01-23 22:28:52

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

我正在为我正在处理的其中一个网站构建一个动态链接系统,这样你就可以放置像{_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);

但是,当我使用$results输出时,数组print_r()没有结果。我是regex语法的完全新手,所以请放轻松我。 :)

我真正要做的是仅保存匹配文本中的数字,以便我可以循环显示正则表达式结果并根据需要替换每个链接,而无需调用{{1 }或preg_replace()

我也尝试了str_replace()功能,但它也没有用。提前谢谢,抱歉,我对正则表达式非常苛刻!

1 个答案:

答案 0 :(得分:2)

试试这个正则表达式:

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

并使用preg_match_all。

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

如果确实想要只保存号码,可以使用此正则表达式:

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

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

在ideone.com上查看here