1

我正在为我想象的 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

4 回答 4

4

*单独并不意味着什么。它是一个量词,它需要与其他东西一起使用。在这种情况下,一个点.就可以(意思是“任何事情”)。此外,您可以使用惰性量词而不是贪婪的量词来在遇到]].
所以...

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

编辑:
您必须转义,[因为它们标志着字符类的开始。

于 2013-04-23T13:53:21.227 回答
2
preg_match_all("/\[\[([^\]]*?)\]\]/i",$content,$matches);
于 2013-04-23T13:54:05.010 回答
1

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

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

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

于 2013-04-23T13:53:34.780 回答
1

您需要转义[as\[然后将整体表达式与 un-greedy flag 匹配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);
于 2013-04-23T13:54:21.137 回答