苦苦挣扎的PHP正则表达式

时间:2013-04-23 13:51:06

标签: php regex preg-match-all

我正在努力解决preg_match_all()调用我想象的非常简单的正则表达式。我正在寻找模仿维基媒体风格的内部链接系统,它将这样的[[link]]变成一个链接。

我正在寻找一个正则表达式,它将搜索字符串以查找[[foobar]]的任何示例并将“foobar”返回给我。 foob​​ar应该是狂野的。

我尝试了以下内容:

<?php
 $content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
 $links = preg_match_all("[[*]]",$content,$matches);
 print_r($matches);
?>

我没有得到任何东西。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

仅仅{p> *并不意味着什么。这是一个量词,它需要与其他东西。在这种情况下,点.会(意味着“任何东西”)。此外,只要遇到]],就可以使用lazy quantifiers代替贪婪的人来停止。
所以......

$links = preg_match_all("/\[\[(.*?)]]/",$content,$matches);

修改
您必须转义[,因为它们标记了character classes的开头。

答案 1 :(得分:2)

preg_match_all("/\[\[([^\]]*?)\]\]/i",$content,$matches);

答案 2 :(得分:1)

使用以下模式/\[\[(.*)\]\]/U

$content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
$links = preg_match_all("/\[\[(.*)\]\]/U",$content,$matches);
print_r($matches);

解释。正则表达式需要以/的分隔符开始和结束。方括号[必须在\[等正则表达式中进行转义。括号内的内容必须位于捕获组(.*)内。最后使用了ungreedy修饰符U来确保只捕获最近括号之间的内容。 (删除以查看其功能)

答案 3 :(得分:1)

您需要将[转义为\[,然后将整体表达式与非贪婪标记U匹配。

$content = "Lorem ipsum dolor [[sit]] amet, consectetur adipiscing [[elit]].";
$links = preg_match_all("/\[\[(.*)]]/U",$content,$matches);
print_r($matches);

Array(
    [0] => Array (
        [0] => [[sit]]
        [1] => [[elit]]
    )
    [1] => Array (
        [0] => sit
        [1] => elit
    )
)

编辑:用户ridgerunner指出使用/U修饰符被认为是不好的做法,因为它会使所有匹配的量词变得贪婪,包括不合理的量词。建议的匹配代码是(.*?),而不是上面发布的代码,它会产生相同的等效答案。

$links = preg_match_all("/\[\[(.*?)]]/",$content,$matches);